想象一下我有以下数据集
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
软件包可以带来发布
答案 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_by
和Group
并计算这些原始值的数量。
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