подсчитывать новые значения за дату для каждой группы

#r #dplyr #data.table #aggregation

#r #dplyr #данные.таблица #агрегирование

Вопрос:

Представьте, что у меня есть следующий набор данных

 Date      Group    Value
01-01-19  A        X
01-01-19  A        Y
01-01-19  A        Z
02-01-19  A        X
02-01-19  A        Y
02-01-19  A        Z
02-01-19  A        W
01-01-19  B        X
01-01-19  B        Y
01-01-19  B        Z
02-01-19  B        X
02-01-19  B        X
02-01-19  B        Z
02-01-19  B        V
  

Итак, есть две группы и две даты. Я хочу видеть для каждой группы и для каждой даты, какие значения являются новыми.

Результирующий фрейм данных должен выглядеть примерно так

 group    date      new_values
A        01-01-19  3 
A        02-01-19  1
B        01-01-19  3
B        02-01-19  1  
  

В итоге я просто подсчитал количество значений на дату для каждой группы и вычел разницу. Но при этом не учитываются значения, которые исчезли с предыдущей даты. Я понятия не имею, как это сделать. Возможно, data.table пакет может принести релиз

Ответ №1:

Функция rowid подсчитывает количество отображений комбинации столбцов, начиная с 1:

 library(data.table)
setDT(DT)

DT[, new := rowid(Group, Value) == 1L]
DT[, .(n_new = sum(new)), by=.(Group, Date)]
#    Group     Date n_new
# 1:     A 01-01-19     3
# 2:     A 02-01-19     1
# 3:     B 01-01-19     3
# 4:     B 02-01-19     1
  

Ответ №2:

Одна из возможностей:

 library(dplyr)

df %>%
  arrange(Date = as.Date(Date, "%d-%m-%y")) %>%
  group_by(Group, Value) %>%
  mutate(New = row_number()) %>%
  group_by(Group, Date) %>%
  summarise(New = sum(New == 1))
  

Вывод:

 # A tibble: 4 x 3
# Groups:   Group [2]
  Group Date       New
  <fct> <fct>    <int>
1 A     01-01-19     3
2 A     02-01-19     1
3 B     01-01-19     3
4 B     02-01-19     1
  

Вышесказанное предполагает, что ваша дата находится в формате day-month-year ; если это не так, вы просто измените "%d-%m-%y" на "%m-%d-%y" .

Ответ №3:

Используя dplyr , мы можем сначала group_by Group создать столбец ( orig ), который был бы TRUE таким, если бы он был виден в группе впервые. Затем мы group_by Group и Date и подсчитываем количество таких исходных значений.

 library(dplyr)

df %>%
  group_by(Group) %>%
  mutate(orig = !duplicated(Value)) %>%
  group_by(Group, Date) %>%
  summarise(new_values = sum(orig))

#  Group     Date     new_values
#   <fct> <fct>         <int>
#1   A     01-01-19          3
#2   A     02-01-19          1
#3   B     01-01-19          3
#4   B     02-01-19          1
  

Ответ №4:

 library(data.table)

dt <- data.table(read.table(text="
01-01-19,A,X
01-01-19,A,Y
01-01-19,A,Z
02-01-19,A,X
02-01-19,A,Y
02-01-19,A,Z
02-01-19,A,W
01-01-19,B,X
01-01-19,B,Y
01-01-19,B,Z
02-01-19,B,X
02-01-19,B,X
02-01-19,B,Z
02-01-19,B,V
",sep=",",strip.white = TRUE))

setnames(dt,c("date","group","value"))
  

Одним из решений было бы найти уникальные значения по группам. Затем суммируйте уникальные значения по группе и дате.

 ##     > dt[,dup:=!duplicated(value),.(group)][,sum(dup),.(group,date)]
## group     date V1
## 1:     A 01-01-19  3
## 2:     A 02-01-19  1
## 3:     B 01-01-19  3
## 4:     B 02-01-19  1