it-swarm.com.de

Richtiger Weg, um data.frame in eine numerische Matrix zu konvertieren, wenn df auch Strings enthält?

Ich habe einen Datenrahmen aus einer .csv-Datei, die numerische und Zeichenwerte enthält. Ich möchte diesen Datenrahmen in eine Matrix konvertieren. Alle enthaltenen Informationen sind Zahlen (die von mir gelöschten Nicht-Zahlenzeilen), daher sollte es möglich sein, den Datenrahmen in eine numerische Matrix zu konvertieren. Ich bekomme jedoch eine Zeichenmatrix.

Ich fand die einzige Möglichkeit, dies zu lösen, die Verwendung von as.numeric Für jede einzelne Zeile, aber dies ist ziemlich zeitaufwendig. Ich bin mir ziemlich sicher, dass es einen Weg gibt, dies mit irgendeiner Form von if(i in 1:n) zu tun, aber ich kann nicht herausfinden, wie es funktionieren könnte. Oder ist die einzige Möglichkeit, wirklich bereits mit numerischen Werten zu beginnen, wie hier vorgeschlagen ( Erstellen von numerischen Matrix- und Namensreihenfolgen )?

Wahrscheinlich ist das für die meisten von Ihnen sehr einfach: P

Die Matrix ist viel größer, dies sind nur die ersten paar Zeilen ... Hier ist der 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

Vielen Dank für jede Hilfe!

48
PikkuKatja

Edit 2: Siehe @ flodels Antwort. Viel besser.

Versuchen:

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

Edit: oder wie @ CarlWitthoft in den Kommentaren vorgeschlagen:

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

Von ?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

Hier ist eine alternative Möglichkeit, wenn der Datenrahmen nur Zahlen enthält.

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

die zuverlässigste Methode zum Konvertieren eines Datenrahmens in eine Matrix ist jedoch die Verwendung der Funktion data.matrix().

6
TPArrow

Eine andere Möglichkeit ist die Verwendung des Arguments colClasses für read.table(), um den Spaltentyp anzugeben, indem colClasses=c(*column class types*) angegeben wird. Wenn es 6 Spalten gibt, deren Elemente Sie als numerisch definieren möchten, müssen Sie die Zeichenfolge "numeric" Sechsmal durch Kommas getrennt wiederholen, den Datenrahmen importieren und as.matrix() den Datenrahmen. P.S. Sieht aus, als hättest du Überschriften, also habe ich header=T eingegeben.

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

Ich hatte das gleiche Problem und habe es so gelöst, indem ich den ursprünglichen Datenrahmen ohne Zeilennamen genommen und später hinzugefügt habe

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