【问题标题】:Filter list of data.tables by function argument按函数参数过滤 data.tables 列表
【发布时间】:2020-11-21 09:23:30
【问题描述】:

我正在写一个应该过滤列表中每个data.table 的函数。

一个例子:

library(purrr)
library(magrittr)
library(data.table)

My.List <- 
  as.data.table(iris) %>% 
  split(by = "Species")

map(My.List, ~.x[Sepal.Length < 5.5])

这正是我想要的结果。但是该功能应该非常用户友好。这是我想要的功能,如果我可以有多个条件由, 分隔,就像在dplyrfilter 中一样,那就更好了:

myfunction(My.List, Sepal.Length < 5.5)
myfunction(My.List, Sepal.Length < 5.5, Petal.Width > 1)

【问题讨论】:

  • 只是想学习和理解。我试过as.data.table(iris) %&gt;% group_by(Species) %&gt;% filter(Sepal.Length &lt; 5.5, Petal.Width &gt; 1) ,但你想创建自己的函数来过滤行吗?有理由不使用 dplyr 吗?也许我误解了你的需求。谢谢
  • 在我的实际用例中,它不是一个分组的 data.frame,它是一个带有单独 data.frames 的列表(这必须是)。我想要一个对我的客户来说真的很容易使用的功能,它不仅仅是过滤,过滤也是其中的一部分。

标签: r list data.table


【解决方案1】:

从技术上讲,这称为非标准评估nse。对于 tidyverse,您可以查看 here 以了解 NSE 实现

无论如何回答你的问题:

library(tidyverse)
myfunction <- function(lst, ...){
  nms <- enquos(...)
  map(lst, ~filter(.x, !!!nms))
}

myfunction(My.List, Sepal.Length < 5.5)
myfunction(My.List, Sepal.Length < 5.5, Petal.Width > 1)

如果只对 BASE R 函数感兴趣,您可以这样做:

myfunction <- function(lst, ...){
  nms <- substitute(list(...))
  lapply(lst, function(x)x[Reduce("&", eval(nms, x)),])
 }

【讨论】:

  • 感谢您的回答!我喜欢结合 data.table 尤其是 tidyverse 的管道。 stackoverflow.com/questions/21435339/… 这里有一个很好的讨论,其中也讨论了 data.table 和管道的组合。通常我不使用过滤器,我使用 data.table 的 i 组件。我也喜欢 data.table 的语法。
  • “数据表的目的是为了速度”是基于意见的。我相信很多人会继续使用它,即使由于语法原因它不是最快的选择。
  • 感谢您的编辑,这是最好的解决方案!如果你有一个 data.table,你甚至不需要最后一个逗号。
【解决方案2】:

这是一个基本的 R 等效项,它也可以解决问题。它使用match.call 提取表达式(如果有的话),然后使用lapply 遍历列表,使用eval 评估列表中每个数据帧上下文中的每个表达式。这会为每个数据帧生成一个逻辑向量列表,然后通过Reduce 将这些逻辑向量组合成一个带有“&”的向量。这对每个数据帧进行了子集化。

myfunction <- function(.list, ...)
{
  mc <- as.list(match.call())[-1]
  if(length(mc) == 1) return(.list)
  lapply(.list, function(df)
  {
    conds <- lapply(mc[-1], function(condition) eval(condition, envir = df))
    df[Reduce("&", conds),]
  })
}

【讨论】:

  • 非常感谢!请你稍微解释一下好吗?
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 2020-03-12
  • 2020-05-08
  • 1970-01-01
  • 2015-12-13
  • 2021-12-16
相关资源
最近更新 更多