【发布时间】:2016-08-15 11:23:54
【问题描述】:
我有 3 个data.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
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 列中的字母a 和b 对它们进行子集:
wanted_sub_class <- c("a", "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)
}
}
这应该给我 6 个列表元素(根据预期的输出),但它只给了 3 个并且只有元素 b。
不过,理想情况下,如果确实可行,我想将结果放在my_list 的列表中,每个class。所以我想在列表中保留 3 个 data.frames 的结构,然后有一个列表,其中包含 a 和 b 类的数据 - 否则,六个列表将起作用
我知道循环并不理想,但我无法真正理解 vecortisation(例如使用 lapply)。我将不胜感激循环(如果可能的话)和矢量化的答案。
【问题讨论】:
-
试试
lapply(my_list, function(x) { subset(x, class %in% c("a", "b")) })
标签: r loops vectorization