将值列表转换为每个值的列表索引列表

时间:2018-11-24 19:00:30

标签: r

我有一个包含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”创建这样的索引列表?

4 个答案:

答案 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中使用meltcats.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)

screenshot

答案 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
#