Добавить столбец с количеством определенных значений внутри группы в dataframe

#r #dataframe

#r #dataframe

Вопрос:

У меня есть dataframe:

 ID       SUB_ID     Action  
1         A          Open
1         A          Download
1         A          Close
1         B          Open
1         B          Search
1         B          Download
1         B          Close
2         AA          Open
2         AA          Download
2         AA          Close
2         BB          Open
2         BB          Search
2         BB          Filter
2         BB          Close
3         C           Open
3         C           Search
3         C           Filter
3         C           Close
  

Я хочу получить таблицу с идентификатором и номером SUB_ID для каждого идентификатора и номером «Загрузки» в действии столбца в пределах одного SUB_ID. Итак, желаемый результат:

 ID       SUB_ID_n     Download_n 
1         2            2
2         2            1
3         1            0
  

Как я мог это сделать?

Комментарии:

1. Что, если, например, в ID1 была одна загрузка для SUB_ID A и две загрузки для SUB_ID B? Вы имеете в виду скорее количество загрузок в пределах одного идентификатора?

Ответ №1:

Подсчитайте количество уникальных значений с использованием n_distinct и суммируйте по логическим значениям для вычисления строк Action == 'Download' .

 library(dplyr)

df %>%
  group_by(ID) %>%
  summarise(SUB_ID_n = n_distinct(SUB_ID, na.rm = TRUE), 
            Download_n = sum(Action == 'Download'))

#    ID SUB_ID_n Download_n
#  <int>    <int>      <int>
#1     1        2          2
#2     2        2          1
#3     3        1          0
  

В data.table это может быть записано как :

 library(data.table)
setDT(df)[, .(SUB_ID_n = uniqueN(SUB_ID, na.rm = TRUE), 
              Download_n = sum(Action == 'Download')), ID]
  

данные

 df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), SUB_ID = c("A", "A", "A", "B", 
"B", "B", "B", "AA", "AA", "AA", "BB", "BB", "BB", "BB", "C", 
"C", "C", "C"), Action = c("Open", "Download", "Close", "Open", 
"Search", "Download", "Close", "Open", "Download", "Close", "Open", 
"Search", "Filter", "Close", "Open", "Search", "Filter", "Close"
)), class = "data.frame", row.names = c(NA, -18L))
  

Комментарии:

1. спасибо, когда я использую ваш второй метод в случае, если в SUB_ID есть NA, он его подсчитывает. Можно ли сделать так, чтобы он не учитывал NA?

2. @french_fries вы можете использовать na.rm = TRUE как uniqueN для, так и n_distinct для игнорирования NA значений. Смотрите обновленный ответ.