подсчитывать новые значения за дату на группу - PullRequest
1 голос
/ 22 марта 2019

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

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 может принести релиз

Ответы [ 4 ]

4 голосов
/ 22 марта 2019

Функция 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
1 голос
/ 22 марта 2019

Используя 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
1 голос
/ 22 марта 2019

Одна возможность:

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".

0 голосов
/ 22 марта 2019
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
...