首页 > 解决方案 > 将列表对象操作到数据框中

问题描述

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 

我想提取/操作上面的这个列表来创建一个看起来更像这样的数据框:

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 中!

这可能吗?

标签: rdplyrsurvey

解决方案


一个选项是循环list来自“myfun”的输出,然后提取组件“svymean”,创建一个 data.frame,sum从“svytable”元素添加 s列,然后rbindlist元素中创建“问题”列行名

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

推荐阅读