gpt4 book ai didi

r - 如何在组内将第一个值与每个后续值进行比较,直到满足条件

转载 作者:行者123 更新时间:2023-12-05 02:37:50 25 4
gpt4 key购买 nike

所以我在下面的一般结构中有一个数据框:

数据框:

<表类="s-表"><头>行数分组日期<正文>1一个2021-05-012一个2021-05-023一个2021-05-034b2021-05-155b2021-05-176b2021-05-307b2021-05-318b2021-05-319c2021-05-0110c2021-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

关于r - 如何在组内将第一个值与每个后续值进行比较,直到满足条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69889776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com