如何绑定svymean输出的行?

时间:2017-11-12 23:53:02

标签: r class survey rbind

为了对调查数据应用权重等,我正在使用survey包。其中包含一个很棒的函数svymean(),它给出了一对平均和标准错误。我现在有几个这样的对,并希望它们与rbind()结合到一个data.frame中。

library(survey)
data(fpc)

fpc.w1 <- with(fpc, svydesign(ids = ~0, weights = weight, data = fpc))
fpc.w2 <- with(fpc, svydesign(ids = stratid, weights = weight, data = fpc))

(msd.1 <- svymean(fpc$x, fpc.w1))
#        mean     SE
# [1,] 5.4481 0.7237

(msd.2 <- svymean(fpc$x, fpc.w2))
#        mean     SE
# [1,] 5.4481 0.5465

rbind(msd.1, msd.2)
#           [,1]
# msd.1 5.448148
# msd.2 5.448148

可以看出,SE缺失了。检查对象产生如下:

class(msd.1)
# [1] "svystat"

str(msd.1)
# Class 'svystat'  atomic [1:1] 5.45
#   ..- attr(*, "var")= num [1, 1] 0.524
#   .. ..- attr(*, "dimnames")=List of 2
#   .. .. ..$ : NULL
#   .. .. ..$ : NULL
#   ..- attr(*, "statistic")= chr "mean"

所以我做了一些猜测。

msd.1$mean
# Error in msd.1$mean : $ operator is invalid for atomic vectors

msd.1$SE
# Error in msd.1$SE : $ operator is invalid for atomic vectors

msd.1[2]
# [1] NA

msd.1[1, 2]
# Error in msd.1[1, 2] : incorrect number of dimensions

包中包含一个名为SE()的函数,它产生:

SE(msd.1)
#          [,1]
# [1,] 0.723725

确定。通过这个我终于可以完成绑定这些行的解决方案:

t(data.frame(msd.1=c(msd.1, SE(msd.1)),
             msd.2=c(msd.2, SE(msd.2)),
             row.names = c("mean", "SD")))
#           mean        SD
# msd.1 5.448148 0.7237250
# msd.2 5.448148 0.5465021

我是否真的不得不用包来绑定行的痛苦,或者我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以将svymean输出强制转换为数据框,然后rbind将它们放在一起。

do.call(rbind, lapply(list(msd.1, msd.2), as.data.frame))

      mean        SE
1 5.448148 0.7237250
2 5.448148 0.5465021

如果要添加名称,则必须在列表中为项目命名,然后在USE.NAMES = TRUE

中设置lapply
do.call(rbind, lapply(list("msd.1"= msd.1, "msd.2" = msd.2), as.data.frame, USE.NAMES = TRUE))

          mean        SE
msd.1 5.448148 0.7237250
msd.2 5.448148 0.5465021

答案 1 :(得分:1)

tidyverse选项

library(tidyverse)
list(msd.1, msd.2) %>% 
            map_df(as.tibble)
# A tibble: 2 x 2
#     mean        SE
#     <dbl>     <dbl>
#1 5.448148 0.7237250
#2 5.448148 0.5465021