#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
значений. Смотрите обновленный ответ.