Manipulate list object into data frame

为君一笑 提交于 2021-01-05 13:18:40

问题


library(survey)

I have data such as this. I am using the survey package to produce the MEAN, SE and FREQ of each variables in the vector named vars. I am new to manipulating lists in R & would really appreciate help!

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)

The output looks like this:

[[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 

I want to extract/manipulate this list above to create a dataframe that looks more like this:

question    mean     SE      sum_svytable
weight      0.797   0.1177    5.16
married      0.910  0.071     5.16 

As you can see, the sum_svytable is the sum of the frequencies produced in the $svytable generated list for each variable. Even though this number is the same for each variable (5.16 for all) in my example, it is not the same in my dataset.

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 

I don't mind how this result is arrived at, I just need it to be in a df!

Is this possible?


回答1:


An option is to loop over the list of output from 'myfun' then extract teh components, 'svymean', create a data.frame, add the column of sums from 'svytable' element, rbind the list elements and create the 'question' column from the row names

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


来源:https://stackoverflow.com/questions/64795182/manipulate-list-object-into-data-frame

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!