【问题标题】:Assigning arguments to aggregate with variable substitution and paste()使用变量替换和 paste() 将参数分配给聚合
【发布时间】:2017-02-05 02:47:50
【问题描述】:

我正在编写一个 Web 界面来对大型数据集进行统计。小部件将允许用户选择变量和组。每个变量都与一种可以执行的统计相关联。该网页调用一个 R 脚本,该脚本设置适当的数据框以传递给“聚合”,然后传递给各种输出。这里的数据不相关,所以我没有包含它。

我的问题是“聚合”的灵活输入因为我无法弄清楚的原因而爆炸:

group variable “grp”
str(grp)
'data.frame':   1573 obs. of  1 variable:
 $ Loc: Factor w/ 4 levels "ED","ICU","Trans",..: 1 1 1 1 1 1 1 1 1 4 ...

Time variable
TimeBase <- “year”

data
str(tmp)
'data.frame':   554 obs. of  4 variables:
$ Loc     : Factor w/ 4 levels "ED","ICU","Trans",..: 4 1 1 1 4 4 1 1 4 4 ...
$ year    : Factor w/ 7 levels "2011","2012",..: 1 1 1 1 1 1 1 1 1 1 ...
$ ActivLag: num  3 -2 0 1 17 210 19 -7 0 107 ...
$ ScanLag : num  80 12 5 8 159 255 28 109 11 111 ...

aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), na.rm = TRUE, na.action = na.pass)

如果 stvar = “mean”,这可以正常工作,但如果 stvar = “sum”,它不接受 na.rm 作为参数,它就不起作用。所以,我尝试了以下方法:

statstrg <- ifelse(stvar %in% c("sum", "prop","frel", "median"), " na.action    = na.pass", " na.rm = TRUE, na.action = na.pass")
aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp,  paste0(stvar), paste0(statstrg)) 

这不起作用并给出以下错误:

Error in if (na.rm) x <- x[!is.na(x)] else if (any(is.na(x)))  return(x[FALSE][NA]) : 
argument is not interpretable as logical

虽然

aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, paste0(stvar), na.action = na.pass) 

是否适用于 stvar = “sum”。

对 na.rm 和 na.action = na.pass 分别使用条件字符串赋值和 paste(var) 不起作用,因为无法处理聚合解析参数所需的逗号。我尝试在 paste() 中传递各种参数组合,但聚合希望看到单个参数。那么任何人都可以指出一种可能会更好的方法吗?谢谢。

【问题讨论】:

  • 函数sum() 也接受这个na.rm=T/F 参数bdw

标签: r conditional aggregate paste


【解决方案1】:

虽然可以使用字符串动态生成公式,但函数中的参数分配不能从字符串构建,例如可选参数,aggregate() 中的na.rmna.action,其默认值为NULL

考虑根据stvar有条件地分配两个不同的aggregate()调用:

if (stvar %in% c("sum", "prop", "frel", "median")) {
    aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
                       FUN = stvar, na.action = na.pass)
} else {
    aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
                       FUN = stvar, na.rm = TRUE, na.action = na.pass)
}

或者,有条件地将变量 st_narm 分配给 TRUENULL,这需要使用 if 而不是 ifelse,因为您不能将空对象分配给值(替换长度失败)。

if(stvar %in% c("sum", "prop","frel", "median")){
  st_narm <- NULL
} else {
  st_narm <- TRUE
}

aggdf <- aggregate(formula(paste0(". ~", names(grp), " + ", TimeBase)), data = tmp, 
                   FUN = stvar, na.rm = st_narm, na.action = na.pass)

【讨论】:

    【解决方案2】:

    感谢您的好建议!问题已解决,但为了完整性:

    1) "aggregate" 不会将 sum() 作为参数,只有 "sum" 和 na.rm 从 "aggregate" 传递而不是通过 sum() 并且如果 sum 和 na.rm 会给出错误两者同时通过。

    2) if-then st_narm

    3) 带有完整“聚合”字符串的条件运行良好,但似乎不太优雅。但是,完成工作。

    再次感谢。一定要热爱开源社区!

    【讨论】:

    • 太棒了。我在样本数据上测试了这两种解决方案,并且都有效。它必须是您收到的错误中的特定数据。哪个聚合功能。导致该错误:summedianquantile 等?也许尝试 FALSE 而不是 NULL。此外,这些不是字符串,而是aggregate() 方法调用。
    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2022-06-14
    • 2012-08-01
    • 2016-04-22
    • 1970-01-01
    • 2016-01-29
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多