我在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
答案 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的:=
语法很好地协作,因为它始终返回相同数量的行。