r - 按组移动 data.table 中的一列列表

我在 R 中有一列列表:

DT <- data.table(foo = c(list(c("a","b","c")), list(c("b","c")), list(c("a","b")), list(c("a"))), id = c(1,1,2,2))
DT
     foo id
1: a,b,c  1
2:   b,c  1
3:   a,b  2
4:     a  2

我想做的是复制典型的轮类行为以获得:

     foo id
1:   b,c  1
2:    NA  1
3:     a  2
4:    NA  2

对于普通的列,我会使用 shift,但这会将列表拆分为列并移动它们(并标记警告):

DT[ , shift(foo,1,type = "lead"), by = id]
   id V1 V2
1:  1  b  c
2:  1  c NA
3:  1 NA  c
4:  2  b NA
5:  2 NA NA

如果我将 shift 调用包装到一个列表中,返回的是一个列表,但只有矢量元素被移动了:

DT[ , list(shift(foo,1,type = "lead")), by = id]
   id     V1
1:  1 b,c,NA
2:  1   c,NA
3:  2   b,NA
4:  2     NA

最佳答案

这已经出现了more than once .所以我继续并添加了这个功能。不过,您目前必须使用开发版本 v1.9.7.. 请参阅安装说明 here .

DT[, foo2 := shift(.(foo), type = "lead"), 
       by = id]
#      foo id foo2
# 1: a,b,c  1  b,c
# 2:   b,c  1   NA
# 3:   a,b  2    a
# 4:     a  2   NA

只需为列表 中的每个组包装foo。请注意,它返回一个 list-of-list ,它与 := 一起工作,如上所示。如果你没有添加/更新你的 data.table (它不没有多大意义),那么您必须提取列表元素。

DT[, .(foo2 = shift(.(foo), type="lead")[[1L]]), 
        by = id]
#    id foo2
# 1:  1  b,c
# 2:  1   NA
# 3:  2    a
# 4:  2   NA

shift() 旨在与 data.table 的 := 语法很好地配合使用,因为它始终返回相同数量的行。

https://stackoverflow.com/questions/38900293/

相关文章:

r - 计算从原点到R中每个时间点的梯形积分

laravel - vagrant up 后,我对 Homestead.yaml 的更改未反射(re

matlab - 是否有编写 matlab 文件开头注释的标准?

java - 如何确定一个数字中的所有设置位是否也在另一个数字中设置?

c#-6.0 - 有没有办法将 C# 6 的字符串插值与多行字符串一起使用?

python - Flask:重定向(url_for())返回html但不加载页面

php - 匹配不同值的 RegEx BackReference

php - 匹配来自所有语言php的字母的正则表达式

java - 在露天。如何创建临时文件进行测试?

web-services - 基于操作的 URI 和基于资源的 URI 之间有什么区别?