[英]Loop through list as input into filter() function in R
我正在寻找遍历数据框中的所有列组合并过滤掉值小于零的行。 我已经编写了大部分代码,但我很难将列表的值输入到过滤器 function 中。
我首先创建了我的数据框“df”。 我写了一个 function 来获取列名的所有组合,以用作过滤器 function 的输入。 我使用 if_all 是因为我只想要所有列都大于 0 的行。
这是一个示例数据框
library(dplyr)
item1 <- c(-.5, 1.3, .8)
item2 <- c(.9, 2.5, 1.2)
item3 <- c(-1.2, .4, -2.1)
df <- data.frame(item1,item2,item3)
这是我要循环遍历的所有列组合
name_combos <- lapply(1:3, function(x) combn(c("item1","item2","item3"), x, simplify = FALSE))
name_combos <- unlist(name_combos, recursive = FALSE)
这是我挣扎的地方。 我正在寻找正确的输入,这样我就可以遍历 name_combos 并输入列名的每个组合,其中“?” 是。
for (i in 1:length(name_combos)) {
results <- df %>%
filter(if_all(?, ~ . > 0))
print(results)
}
如果需要更多说明,请告诉我。 预先感谢您的任何帮助。
从您的name_combo
object,您可以执行以下操作:
name_combos %>%
map(~filter(df, if_all(all_of(.x), ~. > 0)))
[[1]]
item1 item2 item3
1 1.3 2.5 0.4
2 0.8 1.2 -2.1
[[2]]
item1 item2 item3
1 -0.5 0.9 -1.2
2 1.3 2.5 0.4
3 0.8 1.2 -2.1
[[3]]
item1 item2 item3
1 1.3 2.5 0.4
:
:
请注意, combn
中有一个 function 参数,因此我们可以这样做: 在一个步骤中,您可以执行以下操作:
map(1:3, ~combn(df, .x, \(x)filter(df, invoke(pmin, x)>0), simplify = F))
如果你想使用if_all
:
map(1:3, ~combn(names(df), .x, \(x) filter(df, if_all(all_of(x), ~.>0)), simplify = F))
然后您可以使用recursive = FALSE
unlist
对于 for 循环:
results <- list()
for (i in seq_along(name_combos)) {
nms <- name_combos[[i]]
results[[paste0(nms, collapse = "_")]] <- df %>%
filter(if_all(all_of(nms), ~ .> 0))
}
print(results)
$item1
item1 item2 item3
1 1.3 2.5 0.4
2 0.8 1.2 -2.1
$item2
item1 item2 item3
1 -0.5 0.9 -1.2
2 1.3 2.5 0.4
3 0.8 1.2 -2.1
$item3
item1 item2 item3
1 1.3 2.5 0.4
$item1_item2
item1 item2 item3
1 1.3 2.5 0.4
2 0.8 1.2 -2.1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.