使用 keep、discard 和 filter 将数据帧保留在数据帧列表中

Using keep, discard and filter to keep data frames in a list of data frames

我在 purrr 方面有一些经验,但我想弄清楚这是 keep() 还是 discard 的最佳用例。我有一个数据框列表如下

df1
A      B     C
1      0     4
2      0     5
3      0     6

df2
A      B     C
4      1     0
5      7     9
6      8     0

df_list = list(df1,df2)

显然,以上数据是我编造的。基本思想是保留 B 列不为 0 的数据框。 所以我尝试了

df_list<-keep(df_list,as_mapper(~.x$B!=0))
Error: Predicate functions must return a single `TRUE` or `FALSE`, not a logical vector of length 6

而且我收到了错误警告。如果有人能告诉我我在此功能中做错了什么,将不胜感激。或者我不应该在这种情况下使用 keep/discard。

非常感谢!

我们需要换行 any(如果 'B' 列中至少有一个值不为 0)或 all(如果该列中的所有值都不为 0) return 每个列表元素一个逻辑输出

library(purrr)
keep(df_list, ~ any(.x$B != 0))

-输出

#[[1]]
#  A B C
#1 4 1 0
#2 5 7 9
#3 6 8 0

discard

discard(df_list, ~ all(.x$B == 0))

注意:只有当我们想在 tidyverse env

之外使用 tidyverse lambda 调用(~)时才需要 as_mapper

或使用 base RFilter

Filter(function(x) any(x$B != 0), df_list)

sapply创建逻辑向量和子集

df_list[sapply(function(x) any(x$B != 0))]

数据

df_list <- list(structure(list(A = 1:3, B = c(0L, 0L, 0L), C = 4:6), 
class = "data.frame", row.names = c(NA, 
-3L)), structure(list(A = 4:6, B = c(1L, 7L, 8L), C = c(0L, 9L, 
0L)), class = "data.frame", row.names = c(NA, -3L)))