我有一个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
我想进入每个列表,并按字母a
和b
从class
列中将它们子集化:
wanted_sub_class <- c("a", "b")
然后将结果放入my_list
per的列表中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_list
per列表中class
。所以,我想保持3个data.frames的结构列表,然后有一个清单,在与类的数据a
和b
-否则,六将工作列表
我知道循环不是理想的方法,但是我无法真正实现环绕声(例如使用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(.)))
如果我们需要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]]))
}
对于新的输出格式
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] 删除。
我来说两句