按组移动data.table中的列列

时间:2016-08-11 15:18:02

标签: 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

如果我将移位调用包装到列表中,则返回是一个列表,但只有向量元素被移位:

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

1 个答案:

答案 0 :(得分:3)

这已经出现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的:=语法很好地协作,因为它始终返回相同数量的行。