【问题标题】:How to create one way frequency table with survey weights in R如何在R中使用调查权重创建单向频率表
【发布时间】:2019-10-09 02:05:24
【问题描述】:

我需要创建单向频率表。 表格必须包含变量的比例。

使用 prop.table(svytable()),我可以一次提取一个变量的比例。

library(survey)
round(prop.table(svytable(~varA,design=designA))*100,digits=2)

但是,我需要将每个变量的每个输出连接到一个表中的代码。我尝试了以下,但它不是表格。

c(output1,output2...)

例如,两级 VarA 和 VarB 的预期输出

|Var Name|Proportion|
|       A|          |
|Yes     |      50.0|
|No      |      50.0|
|       B|          |
|Yes     |      20.0|
|No      |      80.0|

使用 c() 的实际输出只是一个向量。

Yes No Yes No
50  50 20  80

样本输入(数据)

structure(list(psu = structure(c(1, 1, 2, 2), format.sas = "BEST"), 
strata = structure(c(1, 2, 3, 4), format.sas = "BEST"), wt =structure(c(1.7, 
0.8, 1.2, 0.3), format.sas = "BEST"), residence = structure(c("Urban", 
"Rural", "Urban", "Urban"), format.sas = "$CHAR"), income = structure(c("High", "Low", "Low", "High"), format.sas = "$CHAR")), 
label = "TEST", row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

如何提取单个变量的比例示例。

分配库

library(survey)

声明 svydesign

testdesign<- svydesign(id=test$psu, strata=test$strata, weight=test$wt, nest=TRUE, data=test)

生成 svytable

a=round(prop.table(svytable(~residence,design=testdesign))*100,digits=2)

【问题讨论】:

  • 您可以使用dput 在您的帖子中添加数据吗?
  • @RonakShah 抱歉,我是 R 新手,您指的是使用 svydesign 或原始数据声明的数据的 dput?
  • dput 来自 svydesign 的数据。 temp &lt;- svytable(~varA,design=designA) 然后复制dput(temp) 的输出。
  • 输出为:structure(c(Urban = 33.17, Rural = 66.83), class= c("svytable", "xtabs", "table"), call = svytable.survey.design(公式 = ~residence, design = tldesign), .Dim = 2L, .Dimnames = list(residence = c("Urban", "Rural")))
  • svytable 来自哪个包?我无法从上述dput 获取数据,您可以通过编辑您的帖子而不是评论来发布dput 原始数据吗?

标签: r survey


【解决方案1】:

这是你想要达到的目标吗?

library(survey)
prop.table(svytable(~residence + income,design=testdesign), 1) * 100

#         income
#residence  High   Low
#    Rural   0.0 100.0
#    Urban  62.5  37.5

如果我们想合并两个输出,我们需要相同的列名,这可以通过setNames 完成

output1 <- round(prop.table(svytable(~residence,design=testdesign))*100,digits=2)
output2 <- round(prop.table(svytable(~income,design=testdesign))*100,digits=2)

rbind(setNames(as.data.frame(output1), c("Var1", "Freq")), 
      setNames(as.data.frame(output2), c("Var1", "Freq")))

#   Var1 Freq
#1 Rural   20
#2 Urban   80
#3  High   50
#4   Low   50

【讨论】:

  • 我不需要第一个输出中显示的交叉表。我需要将 output1 和 output2 结果作为表格垂直附加。问题中显示了预期的输出。
  • @newRuser 您显示的输出不是有效的 R 结构。如果要垂直绑定输出,则需要相同的列名。你可以试试rbind(setNames(as.data.frame(output1), c("Var1", "Freq")), setNames(as.data.frame(output2), c("Var1", "Freq")))
  • 这就是我所需要的
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多