Суммарный `dplyr`` sumrize_all () ` - PullRequest
0 голосов
/ 25 марта 2019

У меня есть фрейм данных со столбцом идентификатора и несколькими столбцами, которые я хочу обобщить. В каждом из столбцов (которые являются взаимоисключающими) я хочу подсчитать строки, которые соответствуют "a", "b" или любому из них.

> df
# A tibble: 5 x 3
     id col1  col2  col3
  <dbl> <chr> <chr> <chr>
1     1 NA    b     NA
2     2 NA    b     NA
3     3 NA    NA    a
4     4 b     NA    NA
5     5 a     NA    NA

Это насколько я получил:

> df %>%
    group_by(id) %>%
    summarize_all(a = nrow(. %>% filter(. == "a"),
                  b = nrow(. %>% filter(. == "b"),
                  x = nrow(!is.na(.))
Error: Can't create call to non-callable object
Call `rlang::last_error()` to see a backtrace

Правильный ли я подход? Я пытаюсь получить что-то похожее на это:

var   a  b  x
-------------
col1  1  1  2
col2  0  2  2
col3  1  0  1

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Одна tidyverse возможность может быть:

 df %>%
  gather(var, letters, -id, na.rm = TRUE) %>%
  add_count(var, letters, name = "n_letters") %>%
  add_count(var, name = "n_all") %>%
  select(-id) %>%
  distinct()

  var   letters n_letters n_all
  <chr> <chr>       <int> <int>
1 col1  b               1     2
2 col1  a               1     2
3 col2  b               2     2
4 col3  a               1     1

Или:

df %>%
 gather(var, letters, -id, na.rm = TRUE) %>%
 add_count(var, letters, name = "n_letters") %>%
 add_count(var, name = "all") %>%
 select(-id) %>%
 distinct() %>%
 spread(letters, n_letters, fill = 0)

  var   all     a     b
  <chr> <int> <dbl> <dbl>
1 col1      2     1     1
2 col2      2     0     2
3 col3      1     1     0
1 голос
/ 25 марта 2019

Вы можете попробовать:

library(tidyverse)

df %>%
  gather(key, value, -id) %>%
  group_by(key, value) %>%
  count %>%
  filter(!is.na(value))

# A tibble: 4 x 3
# Groups:   key, value [4]
  key   value     n
  <chr> <chr> <int>
1 col1  a         1
2 col1  b         1
3 col2  b         2
4 col3  a         1

Если вы хотите, чтобы табличный результат был отредактирован в вашем вопросе, вы можете сделать:

df %>%
  gather(key, value, -id) %>%
  group_by(key, value) %>%
  count %>%
  filter(!is.na(value)) %>%
  group_by(key) %>%
  mutate(x = sum(n)) %>%
  spread(value, n, fill = 0)

# A tibble: 3 x 4
# Groups:   key [3]
  key       x     a     b
  <chr> <int> <dbl> <dbl>
1 col1      2     1     1
2 col2      2     0     2
3 col3      1     1     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...