R - 将带有char值的df转换为数值矩阵更改值

时间:2016-07-23 23:25:07

标签: r

我目前有一个从.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位)。

1 个答案:

答案 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