【问题标题】:lapply to run to run two anonymous functions simultaneouslylapply to run 同时运行两个匿名函数
【发布时间】:2020-11-10 19:16:32
【问题描述】:

我有这样的数据。我正在使用survey 包来生成名为vars 的向量中每个变量的MEANSEFREQ

library(survey)

df <- data.frame(sex = c('F', 'M', NA, 'M', 'M', 'M', 'F', 'F'),
                 married = c(1,1,1,1,0,0,1,1),
                 pens = c(0, 1, 1, NA, 1, 1, 0, 0),
                 weight = c(1.12, 0.55, 1.1, 0.6, 0.23, 0.23, 0.66, 0.67))


vars <- c("sex","married","pens")

这是我的调查设计:

design <- svydesign(ids=~1, data=df, weights=~weight)

我正在使用 lapply 来寻找方法:

lapply(vars, function(x) 
    svymean(as.formula(paste0('~interaction(', x, ')')), design, na.rm = T))

我正在使用 lapply 来查找频率:

lapply(vars, function(x) 
    svytable(as.formula(paste0('~interaction(', x, ')')), design))

有没有办法在这两个函数上运行 lapply 作为同一个 tine?我希望我的输出如下所示:

                   mean     SE     freq
interaction(sex)F 0.60345 0.2067    2.45
interaction(sex)M 0.39655 0.2067    1.61

我试过了:

lapply(vars, function(x) 
  svymean(as.formula(paste0('~interaction(', x, ')')),
  svytable(as.formula(paste0('~interaction(', x, ')')), design)))

【问题讨论】:

  • 只需编写您的匿名函数以在列表中返回两个结果?
  • @Dason 请建议如何做到这一点?

标签: r dplyr survey


【解决方案1】:

最好的方法就是让函数在一个列表中返回两个结果。但老实说,如果在 lapply 之外创建函数变得越来越复杂,我会发现它会更好。所以这就是我可能会做的:

myfun <- function(x){
  means <- svymean(as.formula(paste0('~interaction(', x, ')')), design, na.rm = T)
  table <- svytable(as.formula(paste0('~interaction(', x, ')')), design)
  results <- list(svymean = means, svytable = table)
  return(results)
}

lapply(vars, myfun)

您显然可以将其作为匿名函数来执行,例如...

lapply(vars, function(x){
      means <- svymean(as.formula(paste0('~interaction(', x, ')')), design, na.rm = T)
      table <- svytable(as.formula(paste0('~interaction(', x, ')')), design)
      results <- list(svymean = means, svytable = table)
      return(results)
    })

您甚至不一定需要存储中间结果

lapply(vars, function(x){
      list(svymean = svymean(as.formula(paste0('~interaction(', x, ')')), design, na.rm = T), svytable = svytable(as.formula(paste0('~interaction(', x, ')')), design))})

但希望你会同意这并不漂亮。

【讨论】:

  • 谢谢,这很有帮助,我想知道是否有办法以我在问题中提到的格式获得这些结果?我最终需要将其导出为 df 进行处理...而且这个输出太乱了...
  • 我不使用 svy**** 函数,老实说,我对它们产生的内容不太熟悉。我只是从字面上复制你在问题中的内容并将结果放在一个列表中,因为这就是你所要求的 - 同时两个结果。如果您找到一种使用 svymeans 和 svytable 的方法并从中选择输出,以便它们只给出您想要的数字(我猜问题是它们返回具有大量数字的对象),那么您可以将其修改为更符合您的喜好。
【解决方案2】:

这将频率和均值放在同一行:

lapply(vars, function(x){
       out <-data.frame(eval(bquote(svymean(~interaction(.(as.name(x))), design, na.rm = T))))
       table <- eval(bquote(svytable(~.(as.name(x)),design)))
       out$freq <- table
       out 
       })

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多