Don*_*ong 2 r list dplyr data.table
我试图在存储在列表列中的向量之间进行设置操作,如下所示.
DT <- data.table(exp = c("exp1", "exp2", "exp2"),
sample = c(1L, 1L, 2L),
listdata = list(c(2L,5L), c(2L,3L,5L,7L), c(1L,2L,6L)))
> DT
exp sample listdata
1: exp1 1 2,5
2: exp2 1 2,3,5,7
3: exp2 2 1,2,6
Run Code Online (Sandbox Code Playgroud)
虽然非常繁琐,但我能做到
DT$inc = list(setdiff(unlist(DT$listdata[2]), unlist(DT$listdata[1])))
Run Code Online (Sandbox Code Playgroud)
并获取具有该值的新列表列c(3,7).但是,如果我尝试使用计算当前行和第一行之间的差异
DT$inc = list(list(setdiff(unlist(DT$listdata, recursive = FALSE), unlist(DT$listdata[1]))))
Run Code Online (Sandbox Code Playgroud)
期待一个新专栏"inc"
0
c(3,7)
c(1,6)
Run Code Online (Sandbox Code Playgroud)
我得到c(3,7,1,6).显然unlist将整个列表列拼凑在一起.知道发生了什么事吗?
我也在学习dplyr和data.table.因此,如果您可以使用其中一个提供解决方案,那将非常有用.
[...]我尝试计算当前行和第一行之间的差异
好吧,你可以......
DT[, inc := .(Map(setdiff, listdata, listdata[1L]))]
# exp sample listdata inc
# 1: exp1 1 2,5
# 2: exp2 1 2,3,5,7 3,7
# 3: exp2 2 1,2,6 1,6
Run Code Online (Sandbox Code Playgroud)
但我认为仅仅不使用列表列会好得多.
不使用列表列可能看起来像......
DT[, r := .I]
DT2 = DT[,c(.SD[rep(.I, lengths(listdata))], .(v = unlist(listdata))), .SDcols=!"listdata"]
# exp sample r v
# 1: exp1 1 1 2
# 2: exp1 1 1 5
# 3: exp2 1 2 2
# 4: exp2 1 2 3
# 5: exp2 1 2 5
# 6: exp2 1 2 7
# 7: exp2 2 3 1
# 8: exp2 2 3 2
# 9: exp2 2 3 6
Run Code Online (Sandbox Code Playgroud)
然后我们只使用这个数据集,并且可以做到
DT2[!DT2[r==1L], on="v"]
# exp sample r v
# 1: exp2 1 2 3
# 2: exp2 1 2 7
# 3: exp2 2 3 1
# 4: exp2 2 3 6
Run Code Online (Sandbox Code Playgroud)