r - 如何在组内将第一个值与每个后续值进行比较,直到满足条件
问题描述
所以我在下面的一般结构中有一个数据框:
数据框:
行数 | 团体 | 日期 |
---|---|---|
1 | 一种 | 2021-05-01 |
2 | 一种 | 2021-05-02 |
3 | 一种 | 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 |
我想做的是,在组内,将第一行与下一行进行比较,直到日期之间的差异达到某个阈值,比如 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"))
}
到目前为止,我还无法获得正确的逐行比较,甚至无法实现阈值位。
解决方案
另一种tidyverse
解决方案。我们可以用它accumulate
来完成这个任务。dat
来自 r2evans 的示例。
library(tidyverse)
dat2 <- dat %>%
group_by(group) %>%
mutate(diff_lag = as.integer(date - lag(date))) %>%
mutate(diff = accumulate(diff_lag, function(x, y){
if (is.na(x)){
res <- y
} else if (x > 10){
res <- NA
} else {
res <- x + y
}
return(res)
})) %>%
select(-diff_lag) %>%
ungroup()
dat2
# # A tibble: 10 x 4
# rownum group date diff
# < int> <chr> <date> <int>
# 1 1 a 2021-05-01 NA
# 2 2 a 2021-05-02 1
# 3 3 a 2021-05-03 2
# 4 4 b 2021-05-15 NA
# 5 5 b 2021-05-17 2
# 6 6 b 2021-05-30 15
# 7 7 b 2021-05-31 NA
# 8 8 b 2021-05-31 0
# 9 9 c 2021-05-01 NA
# 10 10 c 2021-05-05 4
推荐阅读
- google-apps-script - GoogleSheet 单元格值触发器
- prolog - Prolog 的新功能 - 程序“temp(A)”不存在可从:weather(A) go
- python-3.x - Matplotlib 散点图交互性不起作用
- c# - 如何在 wpf 中与 tcp 服务器正确通信
- vba - 如何在 Windows 7 中更新 Chromedriver 以在 VBA 中使用 selenium
- postgresql - 在 PostgreSQL 中连接字符串并作为参数添加
- java - Spring的存储库问题
- vb.net - 在 VB.Net 中创建撤消/重做文本框算法
- esp32 - ESP32 闪存加密
- excel - 在 excel 查询编辑器中转换时间范围的 api 数据并绘制图表的更快方法