web-dev-qa-db-fra.com

Bonne façon de convertir data.frame en matrice numérique, lorsque df contient également des chaînes?

J'ai un cadre de données pris à partir d'un fichier .csv qui contient des valeurs numériques et caractères. Je veux convertir ce cadre de données dans une matrice. Toutes les informations contenant sont des nombres (les lignes non numérotées que j'ai supprimées), il devrait donc être possible de convertir le bloc de données en une matrice numérique. Cependant, je reçois une matrice de caractères.

J'ai trouvé que la seule façon de résoudre ce problème est d'utiliser as.numeric Pour chaque ligne, mais cela prend beaucoup de temps. Je suis à peu près sûr qu'il existe un moyen de faire cela avec une sorte de forme if(i in 1:n)-, mais je ne peux pas comprendre comment cela pourrait fonctionner. Ou est-ce vraiment le seul moyen de déjà commencer par les valeurs numériques, comme proposé ici ( Rendre les ordres matriciels et nominatifs )?

C’est probablement une chose très facile pour la plupart d’entre vous: P

La matrice est beaucoup plus grosse, ce ne sont que les premières lignes ... Voici le code:

cbind(
as.numeric(SFI.Matrix[ ,1]),
as.numeric(SFI.Matrix[ ,2]),
as.numeric(SFI.Matrix[ ,3]),
as.numeric(SFI.Matrix[ ,4]),
as.numeric(SFI.Matrix[ ,5]),
as.numeric(SFI.Matrix[ ,6]))  

# to get something like this again:

Social.Assistance Danger.Poverty GINI S80S20 Low.Edu        Unemployment 
0.147             0.125          0.34    5.5   0.149        0.135 0.18683691
0.258             0.229          0.27    3.8   0.211        0.175 0.22329362
0.207             0.119          0.22    3.1   0.139        0.163 0.07170422
0.219             0.166          0.25    3.6   0.114        0.163 0.03638525
0.278             0.218          0.29    4.1   0.270        0.198 0.27407825
0.288             0.204          0.26    3.6   0.303        0.211 0.22372633

Merci pour toute aide!

48
PikkuKatja

Edit 2: Voir la réponse de @ flodel. Beaucoup mieux.

Essayer:

# assuming SFI is your data.frame
as.matrix(sapply(SFI, as.numeric))  

Edit: ou comme suggéré par CarlWitthoft dans les commentaires:

matrix(as.numeric(unlist(SFI)),nrow=nrow(SFI))
53
Ricardo Saporta
data.matrix(SFI)

De ?data.matrix:

Description:

 Return the matrix obtained by converting all the variables in a
 data frame to numeric mode and then binding them together as the
 columns of a matrix.  Factors and ordered factors are replaced by
 their internal codes.
52
flodel

Voici un autre moyen si le bloc de données ne contient que des chiffres.

apply(as.matrix.noquote(SFI),2,as.numeric)

mais le moyen le plus fiable de convertir un cadre de données en matrice consiste à utiliser la fonction data.matrix().

6
TPArrow

Une autre façon de le faire consiste à utiliser l'argument read.table()colClasses pour spécifier le type de colonne en créant colClasses=c(*column class types*). S'il y a 6 colonnes dont les membres sont numériques, vous devez répéter la chaîne de caractères "numeric" Six fois, en les séparant par des virgules, en important le cadre de données et en as.matrix() le cadre de données. P.S. on dirait que vous avez des en-têtes, alors je mets header=T.

as.matrix(read.table(SFI.matrix,header=T,
colClasses=c("numeric","numeric","numeric","numeric","numeric","numeric"),
sep=","))
0

J'ai eu le même problème et je l'ai résolu comme ceci, en prenant le cadre de données d'origine sans noms de lignes et en les ajoutant plus tard

SFIo <- as.matrix(apply(SFI[,-1],2,as.numeric))
row.names(SFIo) <- SFI[,1]
0
Roberto Carlos