计算每个组每个日期的新值

时间:2019-03-22 16:02:35

标签: r dplyr data.table aggregation

想象一下我有以下数据集

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 个答案:

答案 0 :(得分:4)

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 :(得分:1)

一种可能性:

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"

答案 2 :(得分:1)

我们首先可以使用dplyr group_by并创建一列(Group),如果它是第一次在orig中出现群组。然后,我们TRUE group_byGroup并计算这些原始值的数量。

Date

答案 3 :(得分:0)

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
相关问题