从列表中提取元素以创建数据框
Extract elements from list to create data frame
library(survey)
我有这样的数据。我正在使用调查包生成名为 vars 的向量中每个变量的 MEAN、SE 和 FREQ。我不熟悉在 R 中操作列表,非常感谢帮助!
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)
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)
输出如下所示:
[[1]]
[[1]]$svymean
mean SE
interaction(sex)F 0.60345 0.2067
interaction(sex)M 0.39655 0.2067
[[1]]$svytable
interaction(sex)
F M
2.45 1.61
[[2]]
[[2]]$svymean
mean SE
interaction(married)0 0.089147 0.0717
interaction(married)1 0.910853 0.0717
[[2]]$svytable
interaction(married)
0 1
0.46 4.70
[[3]]
[[3]]$svymean
mean SE
interaction(pens)0 0.53728 0.2255
interaction(pens)1 0.46272 0.2255
[[3]]$svytable
interaction(pens)
0 1
2.45 2.11
我想extract/manipulate上面的这个列表来创建一个看起来更像这样的数据框:
Var mean SE freq
interaction(sex)F 0.60345 0.2067 2.45
interaction(sex)M 0.39655 0.2067 1.61
interaction(married)0 0.089147 0.0717 0.46
interaction(married)1 0.910853 0.0717 4.7
这可能吗?
这里有一个选项lapply
do.call(rbind, lapply(lapply(vars, myfun),
function(x) cbind(as.data.frame(x$svymean),
freq = unname(x$svytable))))
-输出
# mean SE freq.Var1 freq.Freq
#interaction(sex)F 0.60344828 0.2066829 A 2.45
#interaction(sex)M 0.39655172 0.2066829 B 1.61
#interaction(married)0 0.08914729 0.0716663 A 0.46
#interaction(married)1 0.91085271 0.0716663 B 4.70
#interaction(pens)0 0.53728070 0.2254907 A 2.45
#interaction(pens)1 0.46271930 0.2254907 B 2.11
您可以决定更改您的主要功能,以便 运行 lapply 仅一次:
myfun <- function(x){
form <- reformulate(sprintf('interaction(%s)', x))
cbind(as.data.frame(svymean(form, design, na.rm = T)), freq = c(svytable(form, design)))
}
do.call(rbind, lapply(vars, myfun))
library(survey)
我有这样的数据。我正在使用调查包生成名为 vars 的向量中每个变量的 MEAN、SE 和 FREQ。我不熟悉在 R 中操作列表,非常感谢帮助!
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)
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)
输出如下所示:
[[1]]
[[1]]$svymean
mean SE
interaction(sex)F 0.60345 0.2067
interaction(sex)M 0.39655 0.2067
[[1]]$svytable
interaction(sex)
F M
2.45 1.61
[[2]]
[[2]]$svymean
mean SE
interaction(married)0 0.089147 0.0717
interaction(married)1 0.910853 0.0717
[[2]]$svytable
interaction(married)
0 1
0.46 4.70
[[3]]
[[3]]$svymean
mean SE
interaction(pens)0 0.53728 0.2255
interaction(pens)1 0.46272 0.2255
[[3]]$svytable
interaction(pens)
0 1
2.45 2.11
我想extract/manipulate上面的这个列表来创建一个看起来更像这样的数据框:
Var mean SE freq
interaction(sex)F 0.60345 0.2067 2.45
interaction(sex)M 0.39655 0.2067 1.61
interaction(married)0 0.089147 0.0717 0.46
interaction(married)1 0.910853 0.0717 4.7
这可能吗?
这里有一个选项lapply
do.call(rbind, lapply(lapply(vars, myfun),
function(x) cbind(as.data.frame(x$svymean),
freq = unname(x$svytable))))
-输出
# mean SE freq.Var1 freq.Freq
#interaction(sex)F 0.60344828 0.2066829 A 2.45
#interaction(sex)M 0.39655172 0.2066829 B 1.61
#interaction(married)0 0.08914729 0.0716663 A 0.46
#interaction(married)1 0.91085271 0.0716663 B 4.70
#interaction(pens)0 0.53728070 0.2254907 A 2.45
#interaction(pens)1 0.46271930 0.2254907 B 2.11
您可以决定更改您的主要功能,以便 运行 lapply 仅一次:
myfun <- function(x){
form <- reformulate(sprintf('interaction(%s)', x))
cbind(as.data.frame(svymean(form, design, na.rm = T)), freq = c(svytable(form, design)))
}
do.call(rbind, lapply(vars, myfun))