【发布时间】:2021-12-21 15:57:45
【问题描述】:
所以我在下面的一般结构中有一个数据框:
数据框:
| rownum | group | date |
|---|---|---|
| 1 | a | 2021-05-01 |
| 2 | a | 2021-05-02 |
| 3 | a | 2021-05-03 |
| 4 | b | 2021-05-15 |
| 5 | b | 2021-05-17 |
| 6 | b | 2021-05-30 |
| 7 | b | 2021-05-31 |
| 8 | b | 2021-05-31 |
| 9 | c | 2021-05-01 |
| 10 | c | 2021-05-05 |
我想做的是,在 GROUP 内,将第一行与下一行进行比较,直到日期之间的差异达到某个阈值,例如 10 天。然后,一旦该行达到阈值,我想将下一行与后续行进行测试。它看起来像这样:
结果,使用阈值 10:
|rownum|group |date |date diff|
|------|------|-----------|---|
|1 | a |2021-05-01 |NA|
|2 | a |2021-05-02 |1|
|3 | a |2021-05-03 |2|
|4 | b |2021-05-15 |NA|
|5 | b |2021-05-17 |2|
|6 | b |2021-05-30 |15 (meets criteria, start from row 7 now)|
|7 | b |2021-05-31 | NA|
|8 | b |2021-05-31 | 0|
|9 | c |2021-05-01 | NA|
|10 | c |2021-05-05 | 4|
因此,重申一下,它将组的第一行与后续行进行比较,直到达到某个阈值。然后计数从组内的第一个代表开始,直到组内的后续行。差异记录为 datediff。
我已经尝试过了,但我不知道 sapply 是否可行:
dataframe %>%
group_by(group) %>%
mutate(
datediff = sapply(date, function(x) {
all(difftime(dataframe$date,dplyr::lag(dataframe, n = 1, default = NA)))
}
)
)
也试过这个,我认为更接近我想要的:
for (m in 1:length(dataframe)) {
dataframe <- dataframe %>%
group_by(group) %>%
rowwise() %>%
mutate(datediff = difftime(dataframe$date,dplyr::lag(date, n = m, default = NA), units="days"))
}
到目前为止,我还无法进行正确的逐行比较,甚至无法实现阈值位。
【问题讨论】:
标签: r if-statement dplyr iteration rowwise