将列表对象操作到数据框中
Manipulate list object into data frame
library(survey)
我有这样的数据。我正在使用调查包生成名为 vars 的向量中每个变量的 MEAN、SE 和 FREQ。我不熟悉在 R 中操作列表,非常感谢帮助!
df <- data.frame(
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("weight","married","pens")
design <- svydesign(ids=~1, data=df, weights=~weight)
myfun <- function(x){
means <- svymean(as.formula(paste0('~(', x, ')')), design, na.rm = T)
table <- svytable(as.formula(paste0('~(', x, ')')), design)
results <- list(svymean = means, svytable = table)
return(results)
}
lapply(vars, myfun)
输出如下所示:
[[1]]
[[1]]$svymean
mean SE
weight 0.79791 0.1177
[[1]]$svytable
weight
0.23 0.55 0.6 0.66 0.67 1.1 1.12
0.46 0.55 0.60 0.66 0.67 1.10 1.12
[[2]]
[[2]]$svymean
mean SE
married 0.91085 0.0717
[[2]]$svytable
married
0 1
0.46 4.70
[[3]]
[[3]]$svymean
mean SE
pens 0.46272 0.2255
[[3]]$svytable
pens
0 1
2.45 2.11
我想extract/manipulate上面的这个列表来创建一个看起来更像这样的数据框:
question mean SE sum_svytable
weight 0.797 0.1177 5.16
married 0.910 0.071 5.16
如您所见,sum_svytable 是 $svytable 为每个变量生成的列表中生成的 频率总和 。尽管在我的示例中这个数字对于每个变量都是相同的(所有变量都是 5.16),但它在我的数据集中并不相同。
sum_svytable was derived like this:
output of myfun function for weight:
[[1]]$svytable
weight
0.23 0.55 0.6 0.66 0.67 1.1 1.12
0.46 0.55 0.60 0.66 0.67 1.10 1.12
I simply summed the frequencies for each response:
sum_svytable(for weight) = 0.46 +0.55+ 0.60+ 0.66+ 0.67+ 1.10+ 1.12
我不介意这个结果是如何得出的,我只需要它在 df 中!
这可能吗?
一个选项是遍历 'myfun' 输出的 list
,然后提取组件,'svymean',创建一个 data.frame,添加 sum
s 来自 'svytable' 元素,rbind
list
元素,并从行名称
创建 'question' 列
out <- lapply(vars, myfun)
lst1 <- lapply(out, function(x)
cbind(setNames(as.data.frame(x$svymean), c("mean", "SE")),
sum_svytable = sum(x$svytable)))
out1 <- do.call(rbind, lst1)
out1$question <- row.names(out1)
row.names(out1) <- NULL
out1[c('question', 'mean', 'SE', 'sum_svytable')]
# question mean SE sum_svytable
#1 weight 0.7979070 0.1177470 5.16
#2 married 0.9108527 0.0716663 5.16
#3 pens 0.4627193 0.2254907 4.56
library(survey)
我有这样的数据。我正在使用调查包生成名为 vars 的向量中每个变量的 MEAN、SE 和 FREQ。我不熟悉在 R 中操作列表,非常感谢帮助!
df <- data.frame(
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("weight","married","pens")
design <- svydesign(ids=~1, data=df, weights=~weight)
myfun <- function(x){
means <- svymean(as.formula(paste0('~(', x, ')')), design, na.rm = T)
table <- svytable(as.formula(paste0('~(', x, ')')), design)
results <- list(svymean = means, svytable = table)
return(results)
}
lapply(vars, myfun)
输出如下所示:
[[1]]
[[1]]$svymean
mean SE
weight 0.79791 0.1177
[[1]]$svytable
weight
0.23 0.55 0.6 0.66 0.67 1.1 1.12
0.46 0.55 0.60 0.66 0.67 1.10 1.12
[[2]]
[[2]]$svymean
mean SE
married 0.91085 0.0717
[[2]]$svytable
married
0 1
0.46 4.70
[[3]]
[[3]]$svymean
mean SE
pens 0.46272 0.2255
[[3]]$svytable
pens
0 1
2.45 2.11
我想extract/manipulate上面的这个列表来创建一个看起来更像这样的数据框:
question mean SE sum_svytable
weight 0.797 0.1177 5.16
married 0.910 0.071 5.16
如您所见,sum_svytable 是 $svytable 为每个变量生成的列表中生成的 频率总和 。尽管在我的示例中这个数字对于每个变量都是相同的(所有变量都是 5.16),但它在我的数据集中并不相同。
sum_svytable was derived like this:
output of myfun function for weight:
[[1]]$svytable
weight
0.23 0.55 0.6 0.66 0.67 1.1 1.12
0.46 0.55 0.60 0.66 0.67 1.10 1.12
I simply summed the frequencies for each response:
sum_svytable(for weight) = 0.46 +0.55+ 0.60+ 0.66+ 0.67+ 1.10+ 1.12
我不介意这个结果是如何得出的,我只需要它在 df 中!
这可能吗?
一个选项是遍历 'myfun' 输出的 list
,然后提取组件,'svymean',创建一个 data.frame,添加 sum
s 来自 'svytable' 元素,rbind
list
元素,并从行名称
out <- lapply(vars, myfun)
lst1 <- lapply(out, function(x)
cbind(setNames(as.data.frame(x$svymean), c("mean", "SE")),
sum_svytable = sum(x$svytable)))
out1 <- do.call(rbind, lst1)
out1$question <- row.names(out1)
row.names(out1) <- NULL
out1[c('question', 'mean', 'SE', 'sum_svytable')]
# question mean SE sum_svytable
#1 weight 0.7979070 0.1177470 5.16
#2 married 0.9108527 0.0716663 5.16
#3 pens 0.4627193 0.2254907 4.56