我目前有一个从.csv
文件读入的数据框。我使用以下方法切割数据框以删除datetime
列和另一个非整数列
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
,但我收到错误:
“colSums(foo)中的错误:'x'必须是数字”
告诉我数据被视为字符数据而不是数字。
我已经阅读了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版本3.3.1 for x86_64-apple-darwin13.4.0
(64位)。
答案 0 :(得分: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