扩展 sapply 以应用变量列表并将输出保存为 R 中的数据帧列表
Extending an sapply to apply list of variables and saving output as list of data frames in R
我有一个类似于下面示例的数据集,复杂样本数据。感谢 SO 用户 IRTFM,我能够调整代码并保存结果(我只对总比例感兴趣,而不是置信区间)作为重塑对象以供进一步处理。我想做的是扩展此 sapply 以生成其他 20 个变量的结果。我想将结果保存为列表中的数据框,理想情况下,因为我认为这是最有效的方法。我的难题是如何扩展 sapply 以便我可以一次处理多个变量。我想到了一个 for 循环遍历一个包含变量名称的列表,并开始制作这个列表,如下 var_list ,但这似乎不是前进的方向。我宁愿利用 apply 系列,因为我希望将结果存储在列表中。
library(survey) # using the `dclus1` object that is standard in the examples.
library(reshape)
library(tidyverse)
data(api)
stype_t <- sapply( levels(dclus1$variables$stype),
function(x){
form <- as.formula( substitute( ~I(stype %in% x), list(x=x)))
z <- svyciprop(form, dclus1, method="me", df=degf(dclus1))
c( z, c(attr(z,"ci")) )} ) %>%
as.data.frame() %>% slice(1) %>% reshape::melt() %>% dplyr::mutate(value = round(value, digits = 4)*100)
假设您随后想使用变量 awards 重复上述操作。您可以复制这些行并以这种方式进行,但效率更高会更好。所以我首先列出了这个示例数据中两个变量的名称,但我对如何将这个列表应用到上面的代码并将结果保留在数据帧列表中感到困惑。我尝试用 lapply 包装 sapply 但这不起作用,因为我打赌那是错误的。任何建议或想法将不胜感激。
var_list <- list("stype", "awards")
而不是 $
来引用命名元素,考虑 [[
提取器来按字符串引用名称。另外,为动态变量扩展 substitute
:
# DEFINED METHOD
df_build <- function(var) {
sapply(levels(dclus1$variables[[var]]), function(x) {
form <- as.formula(substitute(~I(var %in% x),
list(var=as.name(var), x=x)))
z <- svyciprop(form, dclus1, method="me", df=degf(dclus1))
c(z, c(attr(z,"ci")))
}) %>%
as.data.frame() %>%
slice(1) %>%
reshape::melt() %>%
dplyr::mutate(value = round(value, digits = 4)*100)
}
# ITERATE THROUGH CHARACTER VECTOR AND CALL METHOD
var_list <- list("stype", "awards")
df_list <- lapply(var_list, df_build)
我有一个类似于下面示例的数据集,复杂样本数据。感谢 SO 用户 IRTFM,我能够调整代码并保存结果(我只对总比例感兴趣,而不是置信区间)作为重塑对象以供进一步处理。我想做的是扩展此 sapply 以生成其他 20 个变量的结果。我想将结果保存为列表中的数据框,理想情况下,因为我认为这是最有效的方法。我的难题是如何扩展 sapply 以便我可以一次处理多个变量。我想到了一个 for 循环遍历一个包含变量名称的列表,并开始制作这个列表,如下 var_list ,但这似乎不是前进的方向。我宁愿利用 apply 系列,因为我希望将结果存储在列表中。
library(survey) # using the `dclus1` object that is standard in the examples.
library(reshape)
library(tidyverse)
data(api)
stype_t <- sapply( levels(dclus1$variables$stype),
function(x){
form <- as.formula( substitute( ~I(stype %in% x), list(x=x)))
z <- svyciprop(form, dclus1, method="me", df=degf(dclus1))
c( z, c(attr(z,"ci")) )} ) %>%
as.data.frame() %>% slice(1) %>% reshape::melt() %>% dplyr::mutate(value = round(value, digits = 4)*100)
假设您随后想使用变量 awards 重复上述操作。您可以复制这些行并以这种方式进行,但效率更高会更好。所以我首先列出了这个示例数据中两个变量的名称,但我对如何将这个列表应用到上面的代码并将结果保留在数据帧列表中感到困惑。我尝试用 lapply 包装 sapply 但这不起作用,因为我打赌那是错误的。任何建议或想法将不胜感激。
var_list <- list("stype", "awards")
而不是 $
来引用命名元素,考虑 [[
提取器来按字符串引用名称。另外,为动态变量扩展 substitute
:
# DEFINED METHOD
df_build <- function(var) {
sapply(levels(dclus1$variables[[var]]), function(x) {
form <- as.formula(substitute(~I(var %in% x),
list(var=as.name(var), x=x)))
z <- svyciprop(form, dclus1, method="me", df=degf(dclus1))
c(z, c(attr(z,"ci")))
}) %>%
as.data.frame() %>%
slice(1) %>%
reshape::melt() %>%
dplyr::mutate(value = round(value, digits = 4)*100)
}
# ITERATE THROUGH CHARACTER VECTOR AND CALL METHOD
var_list <- list("stype", "awards")
df_list <- lapply(var_list, df_build)