【问题标题】:How to loop through a datatable columns? [duplicate]如何循环遍历数据表列? [复制]
【发布时间】:2017-02-08 14:56:06
【问题描述】:

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

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 替换为每列的列名一样。

【问题讨论】:

  • 我猜你需要for(i in vec) idt[, (i) := as.character(get(i))] where vec &lt;- names(idt)
  • 投票结束,因为this answer 非常适合您,并且基本上在下面的答案中重现

标签: r data.table


【解决方案1】:

我们可以使用for 循环来执行此操作,方法是遍历“idt”的列名。在这种情况下,我们get 字符串的值,将其转换为character 并将其分配给(:=)字符串名称或列名称((i))

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

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

id1[, (vec) := lapply(.SD, as.character), .SDcols = vec]

【讨论】:

  • 谢谢它的工作,为什么LHS需要括号:=
  • @ChiseledAbs 否则,它将假定vec 作为列名,而不是存储在对象vec 中的值
【解决方案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]

【讨论】:

  • 请参阅上面链接问题中的my answer。这不是 data.table 应采用的方式。
  • 感谢 Jaap 的反馈。我已经更新了我的答案以反映你自己的答案。
猜你喜欢
  • 2011-02-28
  • 2015-06-20
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多