我有一个包含6个元素的列表“ cats.list”。有9个唯一的整数,它们是一个或多个元素的成员。例如
cats.list <- list(c(1, 2, 6), c(1, 8, 9), c(3, 4, 5, 7),
c(3, 6, 7), c(1, 3, 7, 8, 9), c(4, 5, 9))
我想为“ cats.list”中的9个整数分别创建一个包含一个元素的列表。新列表中的每个元素都应在“ cat.list”中包含给定整数的列表索引。
例如,“ cat.list”中的列表元素1、2、5中出现1。 2仅出现在元素1中。 3出现在元素3、4、5中。因此,新列表中的前三个元素为:
el.list <- list(c(1, 2, 5), 1, c(3, 4, 5)...)
如何为任何“ cats.list”创建这样的索引列表?
答案 0 :(得分:5)
使用-
cats.list <- list(c(1, 2, 6), c(1, 8, 9), c(3, 4, 5, 7), c(3, 6, 7),
c(1, 3, 7, 8, 9), c(4, 5, 9))
output <- c()
for(i in sort(unique(unlist(cats.list)))){
output <- c(output, list(grep(i,cats.list)))
}
输出
[[1]]
[1] 1 2 5
[[2]]
[1] 1
[[3]]
[1] 3 4 5
[[4]]
[1] 3 6
[[5]]
[1] 3 6
[[6]]
[1] 1 4
[[7]]
[1] 3 4 5
[[8]]
[1] 2 5
[[9]]
[1] 2 5 6
说明
unlist(cats.list)
将现有列表变平,并用unique
包装,然后sort
创建一个搜索列表,您可以使用该列表进行搜索
神奇之处在于grep(i,cats.list)
,它随时可以为您的每次搜索提供所需的内容。
将其放到output
列表中很简单。希望有帮助!
编辑
感谢@ G. Grothendieck,可以将其简化为-
output <- lapply(sort(unique(unlist(cats.list))), grep, cats.list)
答案 1 :(得分:5)
1)reshape2 在reshape2中使用melt
将cats.list
转换为数据帧,其第一列value
是元素,第二列{{1 }}是该元素所属的L1
中的相应组件号。然后cats.list
用指定的公式。
unstack
给予:
library(reshape2)
unstack(melt(cats.list), L1 ~ value)
2)拆分,我们也可以采用这种方式,而无需任何软件包。 $`1`
[1] 1 2 5
$`2`
[1] 1
$`3`
[1] 3 4 5
$`4`
[1] 3 6
$`5`
[1] 3 6
$`6`
[1] 1 4
$`7`
[1] 3 4 5
$`8`
[1] 2 5
$`9`
[1] 2 5 6
等于(1)的rep(seq_along(L), L)
,而m$L1
等于(1)的unlist(cats.list)
。
m$value
3)堆栈/堆栈如果我们命名L <- lengths(cats.list)
split(rep(seq_along(L), L), unlist(cats.list))
组件,我们也可以仅使用基R和堆栈/堆栈。
cats.list
我们可以将其绘制为二部图,如下所示:
cats.named <- setNames(cats.list, seq_along(cats.list))
unstack(stack(cats.named), ind ~ values)
答案 2 :(得分:1)
仅在此处四舍五入可用选项,该版本使用两次调用sapply/lapply
而不是for
循环和grep
:
sapply(sort(unique(unlist(cats.list))), function(x) {
idx <- sapply(cats.list, function(y) any(y == x))
return(which(idx))
})
[[1]]
[1] 1 2 5
[[2]]
[1] 1
[[3]]
[1] 3 4 5
[[4]]
[1] 3 6
[[5]]
[1] 3 6
[[6]]
[1] 1 4
[[7]]
[1] 3 4 5
[[8]]
[1] 2 5
[[9]]
[1] 2 5 6
答案 3 :(得分:0)
tidyverse版本:
tibble(cats.list) %>%
rowid_to_column() %>%
unnest %>%
group_by(cats.list) %>%
summarize_at("rowid", list) %>%
pull(rowid)
# [[1]]
# [1] 1 2 5
#
# [[2]]
# [1] 1
#
# [[3]]
# [1] 3 4 5
#
# [[4]]
# [1] 3 6
#
# [[5]]
# [1] 3 6
#
# [[6]]
# [1] 1 4
#
# [[7]]
# [1] 3 4 5
#
# [[8]]
# [1] 2 5
#
# [[9]]
# [1] 2 5 6
#