Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用循环(或向量化)通过向量中的多个元素来子集列表_R_Loops_Vectorization - Fatal编程技术网

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

R 使用循环(或向量化)通过向量中的多个元素来子集列表,r,loops,vectorization,R,Loops,Vectorization,我有一个包含3个数据的列表。frames: 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 va

我有一个包含3个
数据的列表。frame
s:

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 
然后将结果放入每个
class
my_list
列表中

编辑-预期输出:

$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)

  }
}
结果
我想进入每一个列表,并按字母
a
b

如果您想通过
class
data.frame
s列表子集,只需执行以下操作:

lapply(my_list, function(x) { subset(x, class %in% c("a", "b")) }) 
其中:

#$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
#  class value
#1     a     1
#3     a     4
#6     a     5
#
#$b
#  class value
#2     b     2
#4     b     3
#5     b     4
#$a
#  value class
#1     1     a
#3     4     a
#6     5     a

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

更新:在重新阅读您的问题后,据我所知,您希望通过
,重塑您的实际列表:

然而,在理想情况下,我希望将结果放在每个
class
但我不知道如何在循环中执行此操作

你可以试试:

library(dplyr)

data.table::melt(my_list) %>%
  filter(class %in% c("a", "b")) %>%
  select(class, value) %>%
  split(as.character(.$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
#  class value
#1     a     1
#3     a     4
#6     a     5
#
#$b
#  class value
#2     b     2
#4     b     3
#5     b     4
#$a
#  value class
#1     1     a
#3     4     a
#6     5     a

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

根据@Sumedeh(在现已删除的评论中)提到的,您也可以使用
purrr

library(purrr)
my_list %>% 
  map_df(function(x) x[x$class %in% c("a", "b"), ]) %>% 
  split(.$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
#  class value
#1     a     1
#3     a     4
#6     a     5
#
#$b
#  class value
#2     b     2
#4     b     3
#5     b     4
#$a
#  value class
#1     1     a
#3     4     a
#6     5     a

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

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

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”元素

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]]))
 }
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)
}
或者使用
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]]))
 }
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)
}

result Try
lappy(我的_列表,函数(x){subset(x,类%in%c(“a”,“b”))})
我认为这是不需要的output@StevenBeaupré你也在你的帖子中展示了同样的结果。是的,这是我对他的要求的最初理解,但在重新阅读之后,我想我的答案的第二部分是OP想要的。我喜欢用
bind_rows
而不是
data.table::melt
+1@Bonono更新为
for
循环。我在发布答案时没有看到您的purrr方法。是,我想重塑它,但保留3
data.frame
s的原始列表结构,并在每个框架中嵌套类
a
和类
b