Суммируйте с условиями на основе диапазонов в dplyr - PullRequest
3 голосов
/ 10 октября 2019

Вот иллюстрация моего примера. Пример данных:

 df <- data.frame(ID = c(1, 1, 2, 2, 3, 5), A = c("foo", "bar", "foo", "foo", "bar", "bar"),
 B =     c(1, 5, 7, 23, 54, 202))

df
  ID   A   B
1  1 foo   1
2  1 bar   5
3  2 foo   7
4  2 foo  23
5  3 bar  54
6  5 bar 202

Я хочу суммировать по идентификатору и количеству одинаковых идентификаторов. Кроме того, я хочу, чтобы частоты идентификаторов в подгруппах основывались на значениях B в различных числовых диапазонах (количество наблюдений с B> = 0 и B <5, B> = 5 & B <10, B> = 10 & B <15, B> = 15 & B <20 и т. Д. Для всех идентификаторов). </p>

Я хочу получить такой результат:

  ID count count_0_5 count_5_10 etc
1  1    2          1          1 etc
2  2    2         NA          1 etc
3  3    1         NA         NA etc
4  5    1         NA         NA etc

Я пробовал этот код, используя пакет dplyr:

df %>%
  group_by(ID) %>%
  summarize(count=n(), count_0_5 = n(B>=0 & B<5))

Тем не менее, он возвращает эту ошибку:

`Error in n(B>=0 & B<5) : 
  unused argument (B>=0 & B<5)`

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Возможно, заменив n(B>=0 & B<5) на sum(B>=0 & B<5)?

. Суммирует количество случаев, когда два указанных условия выполнены.

Однако вместо этого вы получите 0'sNA's. Это можно решить следующим образом: ifelse(sum(B>=0 & B<5)>0, sum(B>=0 & B<5), NA)

Я почти уверен, что может быть лучшее решение (более четкое и эффективное), но это должно сработать!

1 голос
/ 10 октября 2019
library(dplyr)
library(tidyr)
df %>% group_by(ID) %>%
   mutate(B_cut = cut(B, c(0,5,10,15,20,1000), labels = c('count_0_5','count_5_10','count_10_15','count_15_20','count_20_1000')), count=n()) %>% 
   group_by(ID,B_cut) %>% mutate(n=n()) %>% slice(1) %>% select(-A,-B) %>% 
   spread(B_cut, n)

#2nd option
left_join(df %>% group_by(ID) %>% summarise(n=n()), 
          df %>% mutate(B_cut = cut(B, c(0,5,10,15,20,1000), labels = c('count_0_5','count_5_10','count_10_15','count_15_20','count_20_1000'))) %>% 
                 count(ID,B_cut) %>% spread(B_cut,n), 
          by='ID')

# A tibble: 4 x 5
# Groups:   ID [4]
     ID count count_0_5 count_5_10 count_20_1000
  <dbl> <int>     <int>      <int>         <int>
1     1     2         2         NA            NA
2     2     2        NA          1             1
3     3     1        NA         NA             1
4     5     1        NA         NA             1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...