【问题标题】:Shift in datatable evaluation数据表评估的转变
【发布时间】:2018-05-18 13:14:24
【问题描述】:

我试图在数据表中使用shift,如下所示:

DT <- data.table(a = c(1,2,3,4,5,6,7), b = c("A","A","A","B","B","B","B"))
DT[!is.na(shift(a, 1)), xy := shift(a, 1), by = b]

这只是证明问题的测试:在第二行中,xy 是 NA。其原因是评估i 部分(作为:DT[i,j,by] 的一部分)的转变不考虑关键字,而j 可以。这对我来说似乎很困惑。这种行为有原因吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您在第二行获得NA-值的原因是因为您使用!is.na(shift(a,1)) 过滤掉了第一行,请参阅:

    > DT[, !is.na(shift(a, n = 1))]
    [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    

    这不包含在by-操作中,因为i 中的过滤是在分组之前完成的。

    因此,xy := shift(a, 1) 将只查看第 2 到第 7 行。

    【讨论】:

    • 谢谢,这行得通,但为什么我必须在此处指定 fill 值而不是在 j 中?
    • 现在您也更改了解决方案。为什么?第一个也有效。请多解释一下你在做什么。我以前从未见过在j 中使用过乘数。我想知道对于更大的例子是否实用。例如,假设a 2 的移位也必须是非 na。所以我们只是乘以一切?
    • @Talik3233 补充说明
    • 谢谢,我明白了。但是现在您也删除了解决方案
    • @Talik3233 这是故意的。如果您想先按组应用过滤器,然后创建新变量,您可以这样做:DT[, .SD[!is.na(shift(a, 1))], by = b][, xy := shift(a, n = 1), by = b][]
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多