R 使用循环(或向量化)通过向量中的多个元素来子集列表
我有一个包含3个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
数据的列表。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 Trylappy(我的_列表,函数(x){subset(x,类%in%c(“a”,“b”))})
我认为这是不需要的output@StevenBeaupré你也在你的帖子中展示了同样的结果。是的,这是我对他的要求的最初理解,但在重新阅读之后,我想我的答案的第二部分是OP想要的。我喜欢用bind_rows
而不是data.table::melt
+1@Bonono更新为for
循环。我在发布答案时没有看到您的purrr方法。是,我想重塑它,但保留3data.frame
s的原始列表结构,并在每个框架中嵌套类a
和类b