web-dev-qa-db-fra.com

Modification des valeurs lors de la conversion du type de colonne en numérique

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?

19
agatha

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.

38
James

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ête
  • NA et non Na ou NaN (ctrl + H et remplacer par NA dans votre fichier de données)
  • pas d'autres chaînes de caractères dans vos colonnes numériques

Alors, R les considérera automatiquement comme numériques.

0
Nakx

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  ", 
0