将列表对象操作到数据框中

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,添加 sums 来自 '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