R 在列表列中设置操作
我试图在存储在列表列中的向量之间执行set操作,如 并获得一个值为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。因此,如果您可以使用其中一种方法提供解决方案,
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