说我有三个清单,
> a
[[1]]
begin end
3 5
9 10
11 14
[[2]]
begin end
3 7
14 18
19 24
[[3]]
begin end
6 9
14 22
18 30
我想要找到的是所有“开始”列的交集,因此在这种情况下,所需的输出将类似于
"3" "14"
我知道How to find common elements from multiple vectors?提供的解决方案;但是,此解决方案假定列表的数量是静态的。如果我在这里的列表数量要改变(例如,对于5个列表,每个列表具有相似的柱状布局),我将如何找到交叉点?
答案 0 :(得分:1)
一种简单的方法是折叠列表元素并使用table
来计算它们
# Recreate the data frame
a <- list(
data.frame(begin = c(3, 9, 11), end = c(5, 10, 14)),
data.frame(begin = c(3, 14, 19), end = c(7, 18, 24)),
data.frame(begin = c(6, 14, 18), end = c(9, 22, 30)))
# "Collapse" the begin columns into a vector.
# We use unlist in case the data frames are not all
# of the same length(thanks @Frank for pointing this out)
a.beg <- unlist(sapply(a, function(x){x$begin}))
# Count the elements
tb <- table(a.beg)
# Get the ones repeated at least twice
# (need to cast to numeric as names are strings)
intersection <- as.numeric(names(tb[tb>=2]))
> intersection
[1] 3 14
答案 1 :(得分:0)
使用@ nico的输入数据......
full <- do.call(rbind, lapply(seq_along(a), function(i) within(a[[i]], {g = i})) )
res <- table(full[,c("begin","g")])
# g
# begin 1 2 3
# 3 1 1 0
# 6 0 0 1
# 9 1 0 0
# 11 1 0 0
# 14 0 1 1
# 18 0 0 1
# 19 0 1 0
行是begin
的唯一值,列是列表的元素。要查看begin
的哪些值出现在列表的多个元素中,请查看
res[ rowSums( res>0 ) > 1, ]
# g
# begin 1 2 3
# 3 1 1 0
# 14 0 1 1
无论您需要进行哪些进一步的分析,都应该在full
而不是数据框架列表上进行,特别是如果需要考虑效率的话。