如何绑定 svymean 输出行?
How to bind rows of svymean output?
为了对调查数据应用权重等,我正在使用 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
我是否真的需要费力地使用包来绑定行,还是我遗漏了什么?
您可以将 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
如果要添加名称,必须在列表中命名项目,然后在lapply
中设置USE.NAMES = TRUE
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
或者 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
为了对调查数据应用权重等,我正在使用 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
我是否真的需要费力地使用包来绑定行,还是我遗漏了什么?
您可以将 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
如果要添加名称,必须在列表中命名项目,然后在lapply
USE.NAMES = TRUE
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
或者 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