R中data.table中的.SD列

时间:2013-05-15 18:28:11

标签: r data.table

j上编写一些在data.table中运行的表达式时,.SD不包含表中的所有列,而只包含表达式使用的列。这对于运行的东西很好,但对于调试来说并不是很棒。查看所有列的最佳方法是什么?我可以将所有名称传递给.SDcols,但这看起来相当繁琐。例如:

x = data.table(a=1:10, b=10:1, id=1:5)
x[,{ browser(); a+1},by=id]
Called from: `[.data.table`(x, , {
    browser()
    a + 1
}, by = id)
Browse[1]> n
debug at #1: a + 1
Browse[1]> .SD
   a
1: 1
2: 6

1 个答案:

答案 0 :(得分:6)

要使所有.SD列都可用,您只需要在j表达式中的某个位置引用它。例如,试试这个:

x[,{.SD; browser(); a+1},by=id]
# Called from: `[.data.table`(x, , {
#     .SD
#     browser()
#     a + 1
# }, by = id)
Browse[1]> .SD
#    a  b
# 1: 1 10
# 2: 6  5

这可行,因为as explained here

  

[.data.table() [...]预览未评估的j表达式,并仅添加到其中引用的.SD列。如果提到.SD本身,它会添加所有DT的列。


或者,如果您不希望为每个分组计算支付加载.SD列的费用,您可以随时通过调用{{x来检查当前加载的x[.I,]子集。 1}}。 (.I是一个变量,用于存储当前组x中的行位置):

x[,{browser(); a+1},by=id]
# Called from: `[.data.table`(x, , {
#     browser()
#     a + 1
# }, by = id)
Browse[1]> x[.I,]
#    a  b id
# 1: 1 10  1
# 2: 6  5  1