Преобразовать объект списка опросов во фрейм данных и разбить столбец строки на несколько столбцов. - PullRequest
0 голосов
/ 21 октября 2019

Я использую пакет Survey для анализа опроса. Я делаю таблицу сопряженности с четырьмя путями из моего набора данных. Мой набор данных выглядит следующим образом (фиктивные данные):

df <- data.frame(
         v_1 = c(2, NA, 2, 1, 1, NA, 2, 1, 2, NA, 1, 2, 1, 2, 2),
         v_2 = c(NA, NA, 1, NA, 1, NA, 2, 1, 3, NA, 1, NA, 1,2, NA),
         v_3 = c(1, NA, NA, 1, 2,2, NA, NA, 2, NA, 2, NA, NA, NA, 2),
         v_4 = c(NA, NA, NA, 1, 2, NA, NA, 1, 2, NA, 2, NA, 1, 2, 1),
      weight = c(526, 1203, 1124, 526, 533, 1064, 564, 1124, 412, 1064, 581,
                 1064, 564, 999, 420),
       v_5 = c(2, NA, 2, 1, 1, NA, 2, 1, 2, NA, 1, 2, 1, 2, 2)
)

После расчета частот для каждой категории, а также стандартных ошибок, я хотел бы преобразовать его в фрейм данных и запустить фильтр сумм и т. Д., Только здесьas.data.frame () из baseR работает. После преобразования и установки индекса я хотел бы разбить первый столбец на несколько столбцов, сопоставляя шаблоны.

library(tidyverse)
library(survey) 

ds <- svydesign(ids=~0,data=df, weights=~weight)

#frequencies for each category as well as standard errors
# convert survey list into dataframe
df <- svytotal(~interaction(v_1, v_2, v_3,v_4), ds , na.rm = TRUE)

# convert to dataframe and reset index
dt <- as.data.frame(df, cut.names)
dt <- data.frame(dt , fix.empty.names = TRUE)

output

                                        total  SE
interaction(v_1, v_2, v_3, v_4)1.1.1.1     0   0
interaction(v_1, v_2, v_3, v_4)2.1.1.1     0   0
interaction(v_1, v_2, v_3, v_4)1.2.1.1     0   0
interaction(v_1, v_2, v_3, v_4)2.2.1.1     0   0
interaction(v_1, v_2, v_3, v_4)1.3.1.1     0   0
interaction(v_1, v_2, v_3, v_4)2.3.1.1     0   0
interaction(v_1, v_2, v_3, v_4)1.1.2.1     0   0
interaction(v_1, v_2, v_3, v_4)2.1.2.1     0   0
interaction(v_1, v_2, v_3, v_4)1.2.2.1     0   0
interaction(v_1, v_2, v_3, v_4)2.2.2.1     0   0

Мне нужно извлечь v_1, v_2, v_3, v_4 в качестве имен переменных и 1.1.1.1 для соответствующих значений формы (v_1, v_2, v_3, v_4)1.1.1.1

v_1  v_2  v_3  v_4
1    1     1    1

Желаемый выход

#only for v_1 :v_3
         v_1        v_2       v_3 total  SE
1          1         1         1     0   0
2          2         1         1     0   0
3          1         2         1     0   0
4          2         2         1     0   0
5          1         3         1     0   0
6          2         3         1     0   0
7          1         1         2     0   0

Ответы [ 2 ]

1 голос
/ 21 октября 2019

удалите параметр drop.empty.groups, если вы не хотите нули

ds <- update( ds , one = 1 )
res <- svyby( ~ one , ~  v_1 + v_2 + v_3 + v_4 , ds , svytotal , drop.empty.groups = FALSE )
res

дает вам то, что вы хотите. возможно дополнительное форматирование

res <- data.frame( res )
rownames( res ) <- NULL
res
1 голос
/ 21 октября 2019

Мы можем использовать extract из tidyr с соответствующими regex

library(tidyverse)

dt %>%
  rownames_to_column() %>%
  extract(rowname, into = paste0("v_", 1:4), 
          regex  = ".*\\)(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)")

#   v_1 v_2 v_3 v_4 total  SE
#1    1   1   1   1     0   0
#2    2   1   1   1     0   0
#3    1   2   1   1     0   0
#4    2   2   1   1     0   0
#5    1   3   1   1     0   0
#6    2   3   1   1     0   0
#7    1   1   2   1     0   0
#8    2   1   2   1     0   0
#9    1   2   2   1     0   0
#10   2   2   2   1     0   0
#11   1   3   2   1     0   0
#12   2   3   2   1     0   0
#13   1   1   1   2     0   0
#14   2   1   1   2     0   0
#15   1   2   1   2     0   0
#16   2   2   1   2     0   0
#17   1   3   1   2     0   0
#18   2   3   1   2     0   0
#19   1   1   2   2  1114 760
#20   2   1   2   2     0   0
#21   1   2   2   2     0   0
#22   2   2   2   2     0   0
#23   1   3   2   2     0   0
#24   2   3   2   2   412 412
...