lapply 到 运行 运行 两个匿名函数同时
lapply to run to run two anonymous functions simultaneously
我有这样的数据。我正在使用 survey
包生成名为 vars 的向量中每个变量的 MEAN
、SE
和 FREQ
。
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)))
最好的方法就是将函数 return 的结果都放在一个列表中。但老实说,如果在 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))})
但希望你会同意这并不漂亮。
这会将频率和均值放在同一行:
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
})
我有这样的数据。我正在使用 survey
包生成名为 vars 的向量中每个变量的 MEAN
、SE
和 FREQ
。
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)))
最好的方法就是将函数 return 的结果都放在一个列表中。但老实说,如果在 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))})
但希望你会同意这并不漂亮。
这会将频率和均值放在同一行:
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
})