2016-07-23 89 views
0

我目前有一個數據框,我從.csv文件讀入。我切碎的數據框使用刪除datetime柱和另一個非整數列:R - 使用char值將df轉換爲數值矩陣更改值

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

的數據現在看起來是這樣的:

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 

這些並不甚至遠程在原始數據幀中的編號不一致。我應該做什麼不同?

我對R(64位)使用R版本3.3.1。

+1

你得至少因素某些列,這在RFAQ,在許多處理很多年來關於SO的問題。 –

回答

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,但返回矩陣mat,因爲colSums()適用於沒有類型轉換開銷的矩陣。

例子:

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 

現在盡我的解決方案:

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