Генерация демографических данных c таблиц / частот большого числа специфических c переменных в R - PullRequest
1 голос
/ 23 января 2020

У меня есть большие наборы данных, которые для «первого запуска» требуют базовых c частот для группы (группы помечены 1 или 0 в столбцах). Проблема в том, что некоторые из базовых c частот предназначены для очень большого числа переменных (180 или около того), которые не имеют имен с префиксом Speci c и не расположены, скажем, в столбцах 2: 100. Они могут быть в столбцах 2:80, а затем сказать 90: 117 и т. Д. c.

Я получаю базовую c суть этого, что-то вроде этого:

mtcars %>% filter(gear == 4) %>% group_by(am) %>% summarise(n=n()) %>% mutate(perc = n / sum(n)*100)

Одна проблема заключается в том, что все мои 3-5 групп помечены в отдельных столбцах, поэтому я потребуется использовать фильтр (pop1 == 1), фильтр (pop2 == 1) и т. д. c. Но есть ли способ для group_by go через 180 переменных с выходом для каждой переменной? Это просто простая частота значений каждой переменной или отсутствует. Таким образом, для mtcars частота будет равна просто am, а затем просто против. Было бы хорошо, если бы вывод был один длинный с двумя столбцами.

Примерно так:

Variable Value  n  Perc
am        0     4  33.3
am        1     8  66.7
vs        0     2  16.7
vs        1     10 83.3

Я понимаю, что это может включать сбор или pivot_longer, но я не смог найти способ преобразовать только 180 переменных, скажем, из 200, для которых мне нужны частоты.

Редактировать:

В итоге я использовал это, чтобы выбрать для многих столбцов:

positions <- c(4:176,198)

И использовал select (позиции), чтобы обойти ввод всех переменных.

1 Ответ

1 голос
/ 23 января 2020

Мы можем использовать map из purrr, чтобы отдельно выполнить группировку и применить тот же код, что и в посте ОП

library(dplyr)
library(purrr)
map_dfr(c('am', 'vs'), ~
      mtcars %>% 
        filter(gear == 4) %>% 
        group_by(Variable = .x, Value = !!rlang::sym(.x))  %>% 
        summarise(n = n()) %>% 
        mutate(perc = n/sum(n) * 100))
# A tibble: 4 x 4
# Groups:   Variable [2]
#  Variable Value     n  perc
#  <chr>    <dbl> <int> <dbl>
#1 am           0     4  33.3
#2 am           1     8  66.7
#3 vs           0     2  16.7
#4 vs           1    10  83.3

Или другой вариант - преобразовать в 'long' формат с pivot_longer

library(tidyr)
mtcars %>% 
    filter(gear == 4) %>%
    select(vs, am) %>% 
    pivot_longer(everything()) %>% 
    count(name, value) %>% 
    mutate(perc = n/sum(n) * 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...