Как создать одностороннюю таблицу частот с весами обследования в R - PullRequest
1 голос
/ 09 октября 2019

Мне нужно создать одностороннюю таблицу частот. Таблицы должны включать пропорции для переменных.

Используя prop.table (svytable ()), я могу извлечь пропорции для одной переменной за раз.

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

Однако мне нужнокоды, которые объединяют каждый вывод для каждой переменной в одну таблицу. Я попробовал ниже, но это не таблица.

c(output1,output2...)

Например, ожидаемый вывод для VarA и VarB с 2 уровнями

|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

Пример dput (data)

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)

1 Ответ

0 голосов
/ 09 октября 2019

Это то, что вы пытаетесь достичь?

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