使用循环(或向量化)通过向量中的多个元素对列表进行子集化

博诺诺

我有一个3data.frame的清单

my_list <- list(a = data.frame(value = c(1:5), class = c(letters[1:3],"a", "b")), b = data.frame (value = c(6:1),class=c(letters[1:4],"a", "b")),c=data.frame(value = c(1:7),class = c(letters[5:1],"a", "b")))

my_list

$a
  value class
1     1     a
2     2     b
3     3     c
4     4     a
5     5     b

$b
  value class
1     6     a
2     5     b
3     4     c
4     3     d
5     2     a
6     1     b

$c
  value class
1     1     e
2     2     d
3     3     c
4     4     b
5     5     a
6     6     a
7     7     b 

我想进入每个列表,并按字母abclass中将它们子集化

wanted_sub_class <- c("a", "b")

然后将结果放入my_listper的列表中class

编辑-预期输出:

$a class a
    value class
       1     a
       4     a

$a class b 
    value class
       2     b
       5     b

$b class a
    value class
      4     a
      2     a

$b class b
   value class
      5     b
      1     b
$c class a
  value class
    5     a
    6     b

$c class b
  value class
     4     b
     7     b

我试图用双循环来做到这一点:

result <- list()

for (i in 1:length(my_list)) {
  for (j in wanted_sub_class {

    result [[i]] <- subset(my_list[[i]], my_list[[i]]$class == j)

  }
}

这应该给我6个列表元素(根据预期的输出),但它只给出3个元素,并且仅给出element元素b

但是,理想情况下,如果实际可行,我希望将结果放入my_listper列表中class所以,我想保持3个data.frames的结构列表,然后有一个清单,在与类的数据ab-否则,六将工作列表

我知道循环不是理想的方法,但是我无法真正实现环绕声(例如使用lapply)。对于循环(如果可能)和向量化的答案,我将不胜感激。

阿克伦

如果我们使用purrr的是Hadleyverse系列软件包

library(purrr)
my_list %>% 
      map(~ .[.$class %in% wanted_sub_class,])
#$a
#   value class
#1     1     a
#2     2     b

#$b
#  value class
#1     4     a
#2     3     b

#$c
#  value class
#4     4     b
#5     5     a

或者,如果输出只需要包含'a'和'b'list元素

library(dplyr)
my_list %>%
       bind_rows %>%
       filter(class %in% wanted_sub_class) %>% 
       split(., .$class)
#$a
#  value class
#1     1     a
#3     4     a
#6     5     a

#$b
#  value class
#2     2     b
#4     3     b
#5     4     b

更新资料

根据OP的更新

my_list %>%
       map(~ .[.$class %in% wanted_sub_class,]) %>%
       map(~split(.x, seq_len(nrow(.x)))) %>%
       do.call("c", .)
#$a.1
#  value class
#1     1     a

#$a.2
#  value class
#2     2     b

#$b.1
#  value class
#1     4     a

#$b.2
#  value class
#2     3     b

#$c.1
#  value class
#4     4     b

#$c.2
#  value class
#5     5     a

或使用bind_rows方法

my_list %>%
    bind_rows %>%
    filter(class %in% wanted_sub_class) %>% 
    split(., seq_len(nrow(.)))

更新2

如果我们需要for循环

result <- setNames(vector('list', length(my_list)), names(my_list))
for(i in seq_along(my_list)){
  result[[i]] <- subset(my_list[[i]], class %in% wanted_sub_class)
  result[[i]] <- split(result[[i]], 1:nrow(result[[i]]))
 }

更新3

对于新的输出格式

 my_list %>% 
     bind_rows(.id = "id")  %>%
     filter(class %in% wanted_sub_class) %>% 
     split(., list(.$id, .$class))

或使用for循环

result <- setNames(vector('list', length(my_list)), names(my_list))
for(i in seq_along(my_list)){
  result[[i]] <- subset(my_list[[i]], class %in% wanted_sub_class)
  result[[i]] <- split(result[[i]], result[[i]]$class, drop = TRUE)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章