J'ai un fichier de données avec le format ci-dessus.
Je l'ai chargé dans R et j'ai essayé de tracer un histogramme avec les valeurs de la colonne dist et j'ai l'erreur "x doit être numérique" .Par conséquent, j'ai essayé de changer le format.
> head(data)
V1 V2
1 type gene_dist
2 A 64667
3 A 76486
4 A 97416
5 A 30876
6 A 88018
> summary(data)
V1 V2
A : 67 100 : 1
B :122 100906 : 1
type: 1 102349 : 1
1033 : 1
10544 : 1
10745 : 1
(Other):184
J'ai essayé de définir le format de la colonne avec sapply
mais les valeurs ont été modifiées:
> data[,2]<-sapply(data[,2],as.numeric)
> head(data)
V1 V2
1 type 190
2 A 146
3 A 166
4 A 189
summary(data)
V1 V2
A : 67 Min. : 1.00
B :122 1st Qu.: 48.25
type: 1 Median : 95.50
Mean : 95.50
3rd Qu.:142.75
Max. :190.00
Est-ce que quelqu'un sait pourquoi cela se passe?
Il semble que votre deuxième colonne est un facteur. Vous devez utiliser as.character
avant as.numeric
. En effet, les facteurs sont stockés en interne sous forme d'entiers avec une table pour donner les étiquettes de niveau de facteur. En utilisant simplement as.numeric
, vous ne recevrez que les codes internes. Il n'est pas nécessaire d'utiliser sapply
car ces fonctions sont vectorisées.
data[,2] <- as.numeric(as.character(data[,2]))
Il est probable que la colonne est un facteur car certaines entrées contiennent des caractères non numériques. Toutes ces entrées seront converties en NA
avec l'avertissement approprié, mais vous voudrez peut-être examiner cela dans vos données brutes.
Remarque: data
est un choix faible (bien que non invalide) pour un nom de variable car il existe une fonction de base du même nom.
Il est probablement préférable de résoudre ce problème lors de la lecture du fichier que d'utiliser as.numeric () ou as.character (). Lors de la lecture de votre fichier, assurez-vous d'avoir
header=TRUE
si la première ligne est l'en-têteNA
et non Na
ou NaN
(ctrl + H et remplacer par NA dans votre fichier de données)Alors, R les considérera automatiquement comme numériques.
J'avais le même problème, mais comme je l'ai constaté, la cause fondamentale était différente et je la partage donc comme une réponse mais pas comme un commentaire.
df <- read.table(doc.csv, header = TRUE, sep = ",", dec = ".")
df$value
# Results in
[1] 2254 1873 2201 2147 2456 1785
# So..
as.numeric(df$value)
[1] 26 14 22 20 32 11
Dans mon cas, la raison était qu'il y avait des espaces avec les valeurs dans le document CSV d'origine. Supprimer les espaces a résolu le problème.
De la dput (df)
" 1178 ", " 1222 ", " 1223 ", " 1314 ", " 1462 ",