Как создать вложенную таблицу в R - PullRequest
0 голосов
/ 29 октября 2018

Я изо всех сил пытаюсь понять, как создать следующую таблицу;

Изображение таблицы

с использованием следующего набора данных

```{r}
df<-data.frame(ID=c(1,2,3,4,5,6),
       Treat_Cont = c("Treatment", "Treatment", "Treatment", "Control", "Control", "Control"),
       Q1 = c("Yes", "No", NA, "Yes", "No", NA),
       Q2 = c("Yes", "No", NA, "Yes", "No", NA)
       )
```

Основная проблема, с которой я столкнулся при использовании table(), пакета expss или tables, заключается в том, что они обрабатывают каждый уровень фактора отдельно, поэтому таблица будет производить подсчет, например, для; Treat_Control == Treatment & Q1 == Yes & Q2 == Yes.

В настоящее время я нахожусь на этапе, когда я не уверен, является ли моя проблема одной из структур данных, то есть мне следует изменить форму набора данных или я пропускаю функцию или аргумент для достижения этого результата.

Спасибо

1 Ответ

0 голосов
/ 30 октября 2018

Решение с expss. Не очень удобный код, на мой взгляд:

library(expss)
df = data.frame(ID=c(1,2,3,4,5,6),
               Treat_Cont = c("Treatment", "Treatment", "Treatment", "Control", "Control", "Control"),
               Q1 = c("Yes", "No", NA, "Yes", "No", NA),
               Q2 = c("Yes", "No", NA, "Yes", "No", NA)
)

df %>% 
    tab_total_row_position("none") %>% # suppress totals
    tab_rows("|" = Treat_Cont) %>%  # "|" suppress var. labels
    tab_cols(total(label = "|")) %>% # "|" suppress var. labels
    # if_na add values for NA
    tab_cells("|" = if_na(Q1, "<NA>")) %>% # "|" suppress var. labels
    tab_stat_cases(label = "Q1") %>% # calculate stats
    tab_cells("|" = if_na(Q1, "<NA>")) %>% # "|" suppress var. labels
    tab_stat_cases(label = "Q2") %>% # calculate stats
    tab_pivot(stat_position = "inside_columns") %>% # labels reposition
    tab_transpose() # transpose table

ОБНОВЛЕНИЕ: более короткое решение.

df %>% 
    calculate(
        cro(Treat_Cont %nest% if_na(Q1, "<NA>"), list("Q1"), total_row_position = "none") %merge%
            cro(Treat_Cont %nest% if_na(Q2, "<NA>"), list("Q2"), total_row_position = "none")
    ) %>% 
    tab_transpose()

Краткое решение с основанием R:

with(df, 
     rbind(
         "Q1" = table(Treat_Cont:addNA(Q1)),
         "Q2" = table(Treat_Cont:addNA(Q2))
     ))
...