R 在列表列中设置操作

R 在列表列中设置操作,r,list,data.table,dplyr,R,List,Data.table,Dplyr,我试图在存储在列表列中的向量之间执行set操作,如 并获得一个值为c(3,7)的新列表列。但是如果我尝试使用 DT$inc = list(list(setdiff(unlist(DT$listdata, recursive = FALSE), unlist(DT$listdata[1])))) 期待一个新的专栏“公司” 我得到c(3,7,1,6)。显然,unlist将整个列表列放在一起。知道发生了什么吗 我还在学习dplyr和data.table。因此,如果您可以使用其中一种方法提供解决方案,

我试图在存储在列表列中的向量之间执行set操作,如

并获得一个值为
c(3,7)
的新列表列。但是如果我尝试使用

DT$inc = list(list(setdiff(unlist(DT$listdata, recursive = FALSE), unlist(DT$listdata[1]))))
期待一个新的专栏“公司”

我得到
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
但我认为不使用列表列要好得多


不使用列表列可能看起来像

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
然后我们只需处理这个数据集,就可以

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

下面是相应的
dplyr
解决方案:

library(dplyr)
DT %>% mutate(inc = lapply(listdata, setdiff, listdata[[1]]))

#   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

答案来得很快。你能解释一下
列表数据[1L]
的用法吗?下面的
dplyr
版本需要使用
[
。此外,我不确定当列表长度很长时将列表分散到多行是否是一个好主意。@Dong Yeah,我也注意到了这一差异。
listdata[[1]]
(在Psidom的回答中)是测试的第一个元素;而
listdata[1]
是列表中仅包含第一个元素的一部分。因此,如果
Lst=list(11,22)
,那么
Lst[[1]
11
,而
Lst[1]
list(11)
1L
中的
L
只是使用了1的整数版本。我需要一个,他需要另一个的原因在于R的概念“回收利用"以及我们使用的两个函数之间的差异。如果您阅读了有关回收和文档
?lappy
?Map
,希望它是有意义的。如果没有,也许可以尝试聊天:哦,将其扩展到多行的原因是因为data.table和dplyr的结构都是最高效、最友好的语法——将行分组。很好的选项。加上一个。
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
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
library(dplyr)
DT %>% mutate(inc = lapply(listdata, setdiff, listdata[[1]]))

#   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