добавить сумму к Tidyverse трубопровода - PullRequest
2 голосов
/ 24 мая 2019

Я использую:

library(tidyverse)

tips <- data.frame(
        gender = c("female", "male", "male")
        ,smoker = c("yes", "no", "no")
        , tip = c(10, 5, 0)
     )

tips %>%
    gather(key_value, value) %>% # wide to long
    count(key_value, value) %>%
    group_by(key_value) %>%
    mutate(percentage = round(n / sum(n), 2)) %>%
    unite(key_value_pair, key_value, value, sep = "=")

Это приводит к:

  key_value_pair n percentage
1  gender=female 1       0.33
2    gender=male 2       0.67
3      smoker=no 2       0.67
4     smoker=yes 1       0.33
5          tip=0 1       0.33
6         tip=10 1       0.33
7          tip=5 1       0.33

Существует ли простой способ получения суммы кончика столбца для приведенного выше примера, где сумма является суммойконкретной комбинации (например, пол = женщина, есть одна строка, таким образом, сумма равна 10, пол = мужчина, есть 2 строки, таким образом, сумма равна 5).Ожидаемый результат будет:

  key_value_pair n percentage sum
1  gender=female 1       0.33  10
2    gender=male 2       0.67   5
3      smoker=no 2       0.67   5
4     smoker=yes 1       0.33  10
5          tip=0 1       0.33   0
6         tip=10 1       0.33  10
7          tip=5 1       0.33   5

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

С некоторой перестановкой можно получить именно то, что вы хотите, всего за несколько строк:

tips %>% 
    mutate(tip_sum = tip, n = 1) %>% 
    gather(column, value, -tip_sum, -n) %>%
    group_by(column, value) %>% 
    summarise_if(is.numeric, sum) %>% 
    mutate(perc = round(n/sum(n), 2))

#### OUTPUT ####

# A tibble: 7 x 5
# Groups:   column [3]
  column value  tip_sum     n  perc
  <chr>  <chr>    <dbl> <dbl> <dbl>
1 gender female      10     1  0.33
2 gender male         5     2  0.67
3 smoker no           5     2  0.67
4 smoker yes         10     1  0.33
5 tip    0            0     1  0.33
6 tip    10          10     1  0.33
7 tip    5            5     1  0.33

Единственное, что я не включаю, это unite, потому что я не считаю это необходимым. Вы можете добавить его обратно, если это необходимо. Порядок столбцов также немного отличается. Переставьте select, если важен порядок столбцов.

Это решение также хорошо работает с другими данными. Например, если ваши данные выглядят так:

  gender smoker tip
1 female    yes  10
2   male     no   5
3   male     no   0
4 female     no   5
5   male    yes  10

Приведенное выше решение вернет это:

# A tibble: 7 x 5
# Groups:   column [3]
  column value  tip_sum     n  perc
  <chr>  <chr>    <dbl> <dbl> <dbl>
1 gender female      15     2   0.4
2 gender male        15     3   0.6
3 smoker no          10     3   0.6
4 smoker yes         20     2   0.4
5 tip    0            0     1   0.2
6 tip    10          20     2   0.4
7 tip    5           10     2   0.4
1 голос
/ 24 мая 2019

Хитрость заключается в том, чтобы сделать сумму отдельно и объединить, т.е.

library(tidyverse)

tips <- data.frame(
        sex = c("female", "male", "male")
        , smoker = c("yes", "no", "no")
        , tip = c(10, 5, 0)
     )

tips %>%
     gather(key_value, value) %>% # wide to long
     count(key_value, value) %>%
     group_by(key_value) %>%
     mutate(percentage = round(n / sum(n), 2)) %>%
        left_join(
            tips %>%
            gather(key_value, value, - 'tip') %>%
            group_by(key_value, value) %>%
            summarise(s = sum(tip)),
            by = c('key_value', 'value')
        )

, что дает,

# A tibble: 7 x 5
# Groups:   key_value [?]
  key_value value      n percentage     s
  <chr>     <chr>  <int>      <dbl> <dbl>
1 gender    female     1       0.33    10
2 gender    male       2       0.67     5
3 smoker    no         2       0.67     5
4 smoker    yes        1       0.33    10
5 tip       0          1       0.33    NA
6 tip       10         1       0.33    NA
7 tip       5          1       0.33    NA

Если вам действительно нужно заполнить NA теми же значениями, что и ваши key_value для tip, тогда вы можете легко заменить их (или coalesce) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...