Создайте кросс-таблицу в R, используя tab_cells, которая показывает значения NA - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь создать набор кросс-таблиц в R, используя команду tab_cells в пакете expss, которая показывает мне количество, общее количество и мои NA. Я не могу получить это, чтобы дать мне NA.

Я пытался использовать na_if и tab_mis_val, и я пытался сделать это с помощью команды cro. Я нашел таблицу частот, которая мне действительно нравится использовать fre, и я хочу воспроизвести ее в основном как кросс-таблицу. Я также использовал tabyl из пакета janitor и могу получить строку NA, но я могу запускать только одну кросс-таблицу за раз вместо того, чтобы говорить от var1 до var10.

#I feel like I'm close with this

data%>%  
  tab_cells(var1 %to% var10) %>%  
  tab_cols(total(), var12) %>%  
  tab_stat_cpct() %>% 
  tab_mis_val() %>% 
  tab_pivot() 

#frequency table I really like that DOES give me NAs
expss_output_viewer()
calculate(data, fre(as.list(var1 %to% var10)))

#attempt to make it as a crosstab

expss_output_viewer()
calculate(data, cro_cases(as.list(var1 %to% var10, var12)))


#Using tabyl I can get NAs but it will only give one one crosstab at a 
# time instead of a` whole set of them.
library(janitor)

data %>% 
tabyl(var1, var12) %>% 
adorn_totals(c("row", "col")) %>% 
adorn_percentages("row") %>% 
adorn_pct_formatting() %>% 
adorn_ns() %>% 
adorn_title("combined") %>% 
knitr::kable() 

Мне нужна таблица с подсчетами, процентами, итоговой строкой и строкой NA. Кажется, я не могу получить строку АН с tab_cells.

1 Ответ

0 голосов
/ 17 мая 2019

if_na должен сделать трюк:

data%>%  
  tab_cells(
    add_val_lab(if_na(var1 %to% var10, 999), c("<NA>" = 999))
  ) %>%  
  tab_cols(total(), var12) %>%  
  tab_stat_cpct() %>% 
  tab_pivot() 

Да, это довольно многословно, и я собираюсь упростить его в будущих expss версиях. Если вы не используете метки значений, вы можете отказаться от функции add_val_lab. if_na(var1 %to% var10, '<NA>') будет достаточно. ОБНОВЛЕНИЕ 21.05

Код с общим процентом:

library(expss)
data(mtcars)
mtcars = apply_labels(mtcars,
                      mpg = "Miles/(US) gallon",
                      cyl = "Number of cylinders",
                      disp = "Displacement (cu.in.)",
                      hp = "Gross horsepower",
                      drat = "Rear axle ratio",
                      wt = "Weight (lb/1000)",
                      qsec = "1/4 mile time",
                      vs = "Engine",
                      vs = c("V-engine" = 0,
                             "Straight engine" = 1),
                      am = "Transmission",
                      am = c("Automatic" = 0,
                             "Manual"=1),
                      gear = "Number of forward gears",
                      carb = "Number of carburetors"
)


# create function which calculate single table with NA percent under the total
tab_with_na = function(x, weight = NULL) {
    rbind(
        cro_cpct(
            list(unvr(x)),  # list(unvr()) to completely drop variable labels
            col_vars = "|",
            weight = weight), 
        # calculate percent of NA
        cro_mean(
            list("<NA>" = unvr(is.na(x)*100)),  # list(unvr()) to completely drop variable labels
            col_vars = "|",
            weight = weight)

    )
}

mtcars %>%  
    tab_cells(am %to% carb) %>%  
    tab_cols(total(), vs) %>% 
    tab_stat_fun(tab_with_na) %>% 
    tab_pivot()  
...