如何循环数据表列?

时间:2017-02-08 14:56:06

标签: r data.table

我希望将数据表的列转换为另一个类,我无法使用字符串引用列。

set.seed(10238)
idt <- data.table(A = rep(1:3, each = 5), B = rep(1:5, 3),
                 C = sample(15), D = sample(15)) 

> idt
    A B  C  D
 1: 1 1 10 14
 2: 1 2  2  2
 3: 1 3 13  3
 4: 1 4  7  1
 5: 1 5  1  8
 6: 2 1 11 15
 7: 2 2  4 10
 8: 2 3 15  7
 9: 2 4 14 12
10: 2 5  5  9
11: 3 1  8 13
12: 3 2  3  4
13: 3 3  9  6
14: 3 4  6 11
15: 3 5 12  5

#All columns are integers 
    > lapply(idt, class)
$A
[1] "integer"
$B
[1] "integer"
$C
[1] "integer"
$D
[1] "integer"

vec = parse(text=c('A','B','C','D'))
for (i in vec) idt[, eval( i ) := as.character( eval(i) ) ]
Error in eval(expr, envir, enclos) : object 'A' not found*

我想通过循环遍历包含表示我想要转换的列名称的字符串的向量来重新分配列类。

我知道other threads解决同样的问题,但它们不是很容易理解。我的问题是为什么我不能循环遍历表达式和eval就像我手动用每个列的列名替换j表达式中的i一样。

** 编辑不是重复 **

  

我知道other threads解决同样的问题,但它们不是很容易理解。我的问题是为什么我不能循环遍历表达式和eval就像我手动用每个列的列名替换j表达式中的i一样。

2 个答案:

答案 0 :(得分:6)

我们可以通过循环遍历“idt”的列名称来实现for循环。在这种情况下,我们get字符串的值,将其转换为character并将其分配(:=)到字符串名称或列名称((i)

vec <- names(idt)
for(i in vec) idt[, (i) := as.character(get(i))]

或者使用.SDcols,我们在.SDcols中指定感兴趣的列,使用.SD遍历data.table(lapply)的子集并分配({{ 1}})它到列名称的向量('vec')

:=

答案 1 :(得分:2)

试试这个:

names <- colnames(idt)
idt <- idt[, lapply(.SD, as.character), .SDcols = (names)]

.SD可与data.table一起使用以获取数据的子集。 .SDcols用于告诉data.table将函数提供给哪些列。

基于this answer,以下是更好的方法:

names <- colnames(idt)
idt[, (names) := lapply(.SD, as.character), .SDcols = names]
相关问题