2016-07-23 12 views
0

私は現在.csvファイルから読み込んだデータフレームを持っています。今R - char値を持つdfを数値行列に変換する値

my.df <- my.df[2:7] 

データを次のようになります:私は使用してdatetime列と別の非整数列を削除するためにデータフレームを刻んだ

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 

私はcolSumsを使用したいが、私は取得していますエラー:

"Error in colSums(foo) : 'x' must be numeric"

これは、データが数値ではなく文字データとして扱われていることを示しています。

私はStackOverflowでいくつかの質問を読んだので、それを変換するためにas.numericを使用する必要があると思われます。例えば、私が試みた:

as.matrix(sapply(my.df, as.numeric)) 

結果は、次のとおり

 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 

これらもリモートオリジナルデータフレームの番号と一致しません。私は何をすべきですか?

x86_64-apple-darwin13.4.0(64ビット)のRバージョン3.3.1を使用しています。

+1

を長年にわたって多くの質問がありました。 –

答えて

1
mat <- sapply(my.df, function(x) as.numeric(levels(x))[x]) 
colSums(mat) 

私は効率のために作られているいくつかのことがあります。

  • as.numeric(levels(x))[x]がはるかに効率的as.numeric(as.character(x))よりは、
  • sapplyを使用してデータフレームmy.dfを処理しますが、colSums()が型変換オーバーヘッドのない場合に機能するため、matという行列を返します。

例:

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 

今、私の解決策試してください:あなたは、少なくとも一部の列のための要因を持っているし、これはRFAQで、多くの中で処理される

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 
+1

これはまさに私が必要としていたものでした。ありがとう! – Jay

関連する問題