dplyr способ табулировать (суммировать) несколько переменных, которые имеют одни и те же "уровни" - PullRequest
0 голосов
/ 28 сентября 2018

Что такое dplyr способ табулирования нескольких переменных, которые имеют одни и те же "уровни", для получения следующего результата?

df <- data.frame(v1 = c("sometimes", "sometimes", "rarely", "never", "often",
                        "often"),
                 v2 = c("often", "sometimes", "rarely", "never", "rarely",
                        "often"))

tab <- data.frame(cbind(table(df$v1), table(df$v2)))
names(tab) <- names(df) 
tab

#          v1 v2
#never      1  1
#often      2  2
#rarely     1  2
#sometimes  2  1

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете использовать этот подход:

> df %>% 
    gather(var) %>% 
    group_by(var) %>% 
    count(value) %>% 
    spread(var, n)
# A tibble: 4 x 3
  value        v1    v2
  <chr>     <int> <int>
1 never         1     1
2 often         2     2
3 rarely        1     2
4 sometimes     2     1

Как указал @Frank, вы можете идти прямо без group_by, вы можете рассчитывать по группам, используя count(), следующим образом:

  df %>% 
  gather %>% 
  count(key,value) %>% 
  spread(key, n)
0 голосов
/ 28 сентября 2018

Один из подходов состоит в том, чтобы преобразовать данные в «длинный» формат, что облегчит простой подсчет вхождений ваших меток, а затем spread их в желаемый формат.

df.count <- df %>% 
  gather(variable, value) %>% 
  group_by(variable, value) %>% 
  count %>% 
  spread(variable, n)

  value        v1    v2
  <chr>     <int> <int>
1 never         1     1
2 often         2     2
3 rarely        1     2
4 sometimes     2     1

Конечно, dplyr не является строго обязательным:

df2 <- sapply(df, table)

Создает именованную матрицу, в отличие от фрейма данных:

          v1 v2
never      1  1
often      2  2
rarely     1  2
sometimes  2  1

И немного больше работы вы можете включитьэто во фрейм данных:

df2 <- sapply(df, table) %>% 
  as.data.frame %>% 
  rownames_to_column(var = 'level')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...