【问题标题】:Passing arguments to subset within a function将参数传递给函数内的子集
【发布时间】:2020-07-29 08:01:20
【问题描述】:

我正在尝试将一堆不同的模型拟合到单个数据集。每个模型都使用结果变量和数据子集的不同组合。为了适应所有这些模型,我创建了一个数据框,其中一列用于结果变量,一列指定数据子集(作为字符串)。 (请注意,子集是重叠的,因此使用nest() 似乎没有明显的方法。)然后我创建了一个新函数,该函数采用该数据帧的一行并使用这些选项调用“lm”。最后,我使用 pmap 将此函数映射到数据框。

经过大量实验后,我找到了一种可行的方法,但这种方法相当不雅(请参阅下文,了解我所做的简化版本)。似乎应该有一种方法可以将子集条件传递给 lm 中的子集参数,而不是使用 parse(eval(text = condition)) 首先创建一个逻辑向量。我阅读了有关元编程的 Advanced R 部分,希望它们能提供一些见解,但我找不到任何有用的东西。

任何建议都会有所帮助。

library(tidyverse)
outcomes <- c("mpg", "disp")
sub_conditions <- c("mtcars$cyl >=6", "mtcars$wt > 2")
models <- expand.grid(y = outcomes, condition = sub_conditions) %>% mutate_all(as.character)
fit <- function(y, condition) {
  # Create the formula to use in all models
  rx <- paste(y, "~ hp + am")
  log_vec <- eval(parse(text = condition))
  lm(rx, data = mtcars[log_vec,])
}
t <- pmap(models, fit) 

【问题讨论】:

    标签: r


    【解决方案1】:

    您确定要使用字符串以这种方式传递条件吗?

    如果是这样,那就没有太多选择了。您可以使用rlang::parse_expr 作为替代。

    fit <- function(y, condition) {
       rx <- paste(y, "~ hp + am")
       lm(rx, data = mtcars[eval(rlang::parse_expr(condition)),])
    }
    

    并通过调用它

    purrr::pmap(models, fit) 
    

    【讨论】:

    • 嗨 Ronak -- 感谢您的回复。不过,您的代码与我的代码几乎相同。希望有更好的方法来做到这一点。
    • @DougJohnson 是的,我也在尝试相同的方法,但正如我所提到的,如果您将条件作为"mtcars$cyl &gt;=6" 这样的字符串传递,我们没有太多选择。
    猜你喜欢
    • 2012-08-06
    • 2012-06-19
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2018-03-13
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多