r - 在列表列中设置操作

标签 r list data.table dplyr

我正在尝试在存储在列表列中的向量之间执行集合操作,例如 this .

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

虽然很麻烦,但我可以做

DT$inc = list(setdiff(unlist(DT$listdata[2]), unlist(DT$listdata[1])))

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

计算当前行和第一行之间的差异
DT$inc = list(list(setdiff(unlist(DT$listdata, recursive = FALSE), unlist(DT$listdata[1]))))

期待一个新列“inc”

0
c(3,7)
c(1,6)

我得到 c(3,7,1,6)。显然 unlist 将整个列表列拼合在一起。知道发生了什么事吗?

我也在学习dplyr和data.table。因此,如果您可以使用其中之一提供解决方案,那将非常有帮助。

最佳答案

[...] I try to calculate the difference between the current row and the first row

好吧,你可以做...

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

关于r - 在列表列中设置操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38796767/

相关文章:

Python删除列表字典中的重复项

r - 使用 data.table 进行汇总并保留因子顺序

r - 是否有一种最佳方法可以使用 data.table 创建一堆新列?

r - 使用 rlang 包解析引用参数

r - R 中 data.frames 与 sapply 之间的高效坐标匹配

c# - 在 UserControl 中的 TextBox 具有焦点时处理 UserControl 中的箭头键以选择列表项

r - 使dcast中的drop参数仅查看公式的RHS

r - 在 R 中控制 POSIX 时间差输出

r - 创建列联表

C# Override List<T> 添加方法来检查列表是否为空