#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