J'ai actuellement un cadre de données que j'ai lu à partir d'un .csv
fichier. J'ai haché le dataframe pour supprimer un datetime
column et une autre colonne non entière utilisant:
my.df <- my.df[2:7]
Les données ressemblent maintenant à ceci:
X2 X3 X4 X5 X6 X7
1 3 4 4 4 3 76
2 3 2 3 3 3 52
3 3 3 4 3 3 64
4 3 3 4 3 3 64
5 4 4 4 4 4 80
6 3 4 4 4 3 76
7 4 4 4 4 4 80
Je voudrais utiliser colSums
, mais je reçois l’erreur:
"Erreur dans colSums (foo):" x "doit être numérique"
ce qui m'indique que les données sont traitées comme des données de type caractères au lieu de données numériques.
J'ai lu plusieurs questions sur StackOverflow qui semblent toutes indiquer que je devrais utiliser as.numeric pour le convertir. Par exemple, j'ai essayé:
as.matrix(sapply(my.df, as.numeric))
Les résultats sont:
X2 X3 X4 X5 X6 X7
[1,] 1 3 2 2 1 3
[2,] 1 1 1 1 1 1
[3,] 1 2 2 1 1 2
[4,] 1 2 2 1 1 2
[5,] 2 3 2 2 2 4
[6,] 1 3 2 2 1 3
[7,] 2 3 2 2 2 4
Celles-ci ne correspondent même pas à distance aux nombres du bloc de données original. Que dois-je faire différemment?
J'utilise R version 3.3.1 pour x86_64-apple-darwin13.4.0
(64 bits).
Réponses:
1 pour la réponse № 1mat <- sapply(my.df, function(x) as.numeric(levels(x))[x])
colSums(mat)
Il y a plusieurs choses que j'ai faites pour l'efficacité:
as.numeric(levels(x))[x]
est beaucoup plus efficace queas.numeric(as.character(x))
;- utilisation
sapply
traiter votre trame de donnéesmy.df
, mais retourne une matricemat
, commecolSums()
fonctionne pour la matrice sans surcharge de conversion de type.
Exemple:
my.df <- data.frame(x1 = gl(3, 2, labels = c(10, 11, 12)),
x2 = gl(2, 3, labels = c(5, 6)))
# x1 x2
#1 10 5
#2 10 5
#3 11 5
#4 11 6
#5 12 6
#6 12 6
data.matrix(my.df) ## same as `sapply(my.df, as.numeric)`
# x1 x2
#[1,] 1 1
#[2,] 1 1
#[3,] 2 1
#[4,] 2 2
#[5,] 3 2
#[6,] 3 2
Maintenant, essayez ma solution:
mat <- sapply(my.df, function(x) as.numeric(levels(x))[x])
# x1 x2
#[1,] 10 5
#[2,] 10 5
#[3,] 11 5
#[4,] 11 6
#[5,] 12 6
#[6,] 12 6
colSums(mat)
#x1 x2
#66 33