繁体   English   中英

从列表中提取元素以创建数据框

[英]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))

我运行以下代码来获取一个包含均值、se 和 freq 的列表,如下所示:

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 

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

    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

您可以决定更改 main 函数以便只运行 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM