如何将dplyr筛选器应用到数据框列表?

25

我有一个包含多个数据框的 list(),我想对它们全部应用 dplyrfilter()

以下是我目前尝试过的示例代码...

require(dplyr)
list.DFs <- list(df1,df2)
lapply(
  X = list.DFS,
  FUN = filter(Gold.fish.count=="Total")
)

但这会出现错误:找不到对象 'Gold.fish.count'


3
也可以尝试使用SE,例如 lapply(list.DFS, dplyr::filter_, "Gold.fish.count=='Total'") 或者直接在基础R中完成整个过程 lapply(list.DFS, subset, Gold.fish.count=='Total') - David Arenburg
2个回答

37

使用purrr

library(purrr)
map(list.DFs, ~filter(.x, Gold.fish.count == "Total"))

显然,您可以使用lapply完全相同的方法:

lapply(list.DFs, function(x) filter(x, Gold.fish.count == "Total"))

这个答案和David Arenburg的答案都展示了过滤后的数据集在控制台中。但是在两种情况下,过滤后的数据框都没有保存到变量中。但是这确实回答了所提出的问题。 - Username
1
要将内容保存到变量中,只需在行首加上 variable <- - yeedle
1
我的意思是将每个更改后的数据框保存到存储它的变量中。 - Username
4
我不确定你的意思。如果你想将过滤后的数据框存储在分配给同一变量的列表中,只需覆盖原始的列表变量即可。 - yeedle
我已添加了一个响应,可能解决了上面第一条评论中的问题。它添加了第二个部分,我认为@Username正在寻找:从列表中删除未满足条件的数据框。 - Bradford

1

没有样例数据很难准确地确定您需要什么(在以后查看如何使用dput函数)。但以下的某些变化可能有所帮助:

indices <- sapply(list.DFs, function(x) x$Gold.fish.count == "Total")
list.DFs[indices]

第一行创建了一个逻辑列表(True/False),其中满足您的条件。然后使用这些逻辑来对原始数据框列表进行子集化。
如果Gold.fish.count是包含每一行都是“Total”的列,则可以使用索引变体:
indices <- sapply(list.DFs, function(x) x$Gold.fish.count[1] == "Total")
list.DFs[indices]

(注意额外的[1]。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接