/ / R - Conversion de df avec des valeurs de caractères en valeurs de modifications de matrice numériques - r

R - Conversion de df avec des valeurs de caractères en valeurs de modifications de matrice numériques - r

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 № 1
mat <- 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 que as.numeric(as.character(x));
  • utilisation sapply traiter votre trame de données my.df, mais retourne une matrice mat, comme colSums() 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