R中data.frames列表的子集

时间:2019-05-13 02:24:14

标签: r function subset

在我的函数中,...下面表示用户命名的所有矢量(例如numericcharacter等)。例如,用户可以定义age = 1:3prof = c("med", "low", "med")。这些额外的向量会添加到名为data.frame的{​​{1}}中。

我想知道是否可以创建一个名为out的新参数,以允许用户从最终输出extract中子集化。

例如,如果用户想要对hage == 2进行子集化,则使用age == 2 & prof == "low"返回输出中的相应匹配项?

extract = age == 2 & prof == "low"

2 个答案:

答案 0 :(得分:3)

这既不使用任何软件包,也不明确使用eval

foo2 <- function(d, per, ..., extract = TRUE) {
  out <- data.frame(...)
  h <- split(out, rep(seq_along(per), per))
  s <- substitute(extract)
  lapply(h, function(x) do.call("subset", list(x, s)))
}


foo2(d = 2:4, per = 1:2, age = 1:3, prof = c("med", "low", "med"), extract = age == 2)

答案 1 :(得分:2)

我们可以在'extract'和eval uate中传递带引号的表达式以过滤行

library(tidyverse)
foo <- function(d, per, extract, ...){ ## Add a new argument called `extract`

   extract <- rlang::enexpr(extract)
   out <- data.frame(d, ...)


  h <- split(out, rep(seq_along(per), per))  
  map(h, ~ .x %>% 
            filter(!! extract))

 }

foo(d = 2:4, per = 1:2, extract = age == 2, age = 1:3, prof = c("med", "low", "med"))
#$`1`
#[1] d    age  prof
#<0 rows> (or 0-length row.names)

#$`2`
#  d age prof
#1 3   2  low

或使用base R

foo <- function(d, per, extract, ...){ ## Add a new argument called `extract`

   extract <- substitute(extract)
   out <- data.frame(d, ...)


   h <- split(out, rep(seq_along(per), per))  
   lapply(h, function(x) subset(x, subset = eval(extract)))

}

foo(d = 2:4, per = 1:2, extract = age == 2, age = 1:3, prof = c("med", "low", "med"))