我在 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/