R中data.table中的.SD列

Ale*_*lex 6 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
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 7

要使所有.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
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为,如此处所述

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


或者,如果您不希望.SD为每个分组计算支付加载列的费用,您始终可以x通过调用检查当前加载的子集x[.I,].(.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
Run Code Online (Sandbox Code Playgroud)