web-dev-qa-db-ja.com

dfにも文字列が含まれている場合、data.frameを数値行列に変換する正しい方法は?

数値と文字値を含む.csvファイルから取得したデータフレームがあります。このデータフレームを行列に変換します。含まれる情報はすべて数字(削除した非数字行)であるため、データフレームを数値行列に変換することができるはずです。ただし、文字マトリックスは取得します。

これを解決する唯一の方法は、すべての行にas.numericを使用することですが、これにはかなり時間がかかります。何らかの種類のif(i in 1:n)- formでこれを行う方法はあると確信していますが、どのように機能するかはわかりません。または、ここで提案されているように、すでに数値ですでに開始する唯一の方法です( 行列の数値と名前の順序を作成する )?

おそらくこれはあなたのほとんどにとって非常に簡単なことです:P

マトリックスは非常に大きく、これは最初の数行のみです...コードは次のとおりです。

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

助けてくれてありがとう!

48
PikkuKatja

編集2:@flodelの答えをご覧ください。ずっといい。

試してください:

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

編集:または@ CarlWitthoftがコメントで示唆したとおり:

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

?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

データフレームに数字のみが含まれる場合の代替方法を次に示します。

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

しかし、データフレームを行列に変換する最も信頼できる方法は、data.matrix()関数を使用することです。

6
TPArrow

別の方法として、read.table()引数colClassesを使用して、colClasses=c(*column class types*)を作成することにより列タイプを指定する方法があります。メンバーが数値として必要な列が6つある場合は、文字列を"numeric"をコンマで区切って6回繰り返し、データフレームをインポートし、as.matrix()データフレームをインポートする必要があります。追伸ヘッダーがあるように見えるので、header=Tと入力します。

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

私は同じ問題を抱えていましたが、行名のない元のデータフレームを取得して後で追加することで、このように解決しました

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