通过公式在R中起作用?

Ric*_*kyB 8 r survey function formula

任何有关这方面的帮助将非常感激.我正在使用Lumley调查包,我正在尝试简化我的代码,但是遇到了一些麻烦.

包中的svymean函数在我的代码中调用如下,其中第一个参数是指示我想要哪些变量的公式,第二个参数是该数据集:

svymean(~hq_ehla, FraSvy, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个函数来提取分类变量的均值(比例)和标准误差,所以我做了以下函数:

stats <- function(repstat, num) {
    estmean <- as.numeric(round(100 * repstat[num], digits=0))
    estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1)
    return(list(mean=estmean, se=estse))
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,所以当我拿出我的第一个类别的平均值和se时,我使用:

stats(svymean(~hq_ehla, FraSvy, na.rm=TRUE), 1)$mean
stats(svymean(~hq_ehla, FraSvy, na.rm=TRUE), 1)$se
Run Code Online (Sandbox Code Playgroud)

我希望能够做到的是将其简化为更短的东西,也许我只需要写:

stats(FraSvy, "hq_ehla", 1)$mean
Run Code Online (Sandbox Code Playgroud)

或类似的东西.问题是我无法弄清楚如何使用变量名将公式传递给函数.

mne*_*nel 13

您可以使用reformulate构建公式并svymean在函数内调用.使用...传递na.rm或其他参数svymean

stats <- function(terms, data,  num, ...) {
  .formula <- reformulate(terms)
  repstat <- svymean(.formula, data, ...)
  estmean <- as.numeric(round(100 * repstat[num], digits=0))
  estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1)
  return(list(mean=estmean, se=estse))
}

stats(data = FraSvy, terms = "hq_ehla", 1, na.rm = TRUE)$mean
Run Code Online (Sandbox Code Playgroud)

有关程序化创建公式对象的更多详细信息,请查看此答案

或者,您可以在函数中传递公式对象.

stats2 <- function(formula, data,  num, ...) {

  repstat <- svymean(formula, data, ...)
  estmean <- as.numeric(round(100 * repstat[num], digits=0))
  estse <- round(100 * sqrt(attributes(repstat)$var[num,num]), digits=1)
  return(list(mean=estmean, se=estse))
}


stats2(data = FraSvy, formula = ~hq_ehla, 1, na.rm = TRUE)$mean
Run Code Online (Sandbox Code Playgroud)