繁体   English   中英

遍历列表作为输入到 filter() R 中的 function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM