在R中的data.table中,.SD列是什么?

6

在对data.table进行一些在j上操作的表达式时,.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个回答

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

这是因为,正如这里所解释的

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


或者,如果您不想为每个分组计算加载 .SD 的列而产生开销,可以通过调用 x[.I,] 来检查当前加载的 x 子集。(.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接