如何循环数据表列?

Chi*_*Abs -2 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*
Run Code Online (Sandbox Code Playgroud)

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

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

**编辑不是重复**

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

akr*_*run 7

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

vec <- names(idt)
for(i in vec) idt[, (i) := as.character(get(i))]
Run Code Online (Sandbox Code Playgroud)

或者使用.SDcols,我们指定感兴趣的列.SDcols,循环遍历data.table(.SD)的子集,并将()lapply指定给:=列名称的向量('vec')

id1[, (vec) := lapply(.SD, as.character), .SDcols = vec]
Run Code Online (Sandbox Code Playgroud)