使用 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 R
和 Filter
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)))
我在 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 R
和 Filter
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)))