gpt4 book ai didi

r - 如何根据R中行之间的日期差异过滤行?

转载 作者:行者123 更新时间:2023-12-04 03:14:42 25 4
gpt4 key购买 nike

内各id ,我想保留至少相隔 91 天的行。在我的数据框中 df下面,id=1有 5 行和 id=2有 1 行。

对于 id=1 ,我只想保留第 1、3 和 5 行。

这是因为如果我们比较第 1 个日期和第 2 个日期,它们相差 32 天。因此,删除第二个日期。我们继续比较第 1 天和第 3 天,它们相差 152 天。所以,我们保持第三次约会。

现在,我们不再使用第一个日期作为引用,而是使用第三个日期。第三个日期和第四个日期相差 61 天。因此,删除第 4 个日期。我们继续比较第 3 个日期和第 5 个日期,它们相差 121 天。所以,我们保持第五次约会。

最后,我们保留的日期是第 1 个、第 3 个和第 5 个日期。至于id=2 ,只有一行,所以我们保留它。所需的结果显示在 dfnew 中.

df <- read.table(header = TRUE, text = "
id var1 date
1 A 2006-01-01
1 B 2006-02-02
1 C 2006-06-02
1 D 2006-08-02
1 E 2007-12-01
2 F 2007-04-20
",stringsAsFactors=FALSE)

dfnew <- read.table(header = TRUE, text = "
id var1 date
1 A 2006-01-01
1 C 2006-06-02
1 E 2007-12-01
2 F 2007-04-20
",stringsAsFactors=FALSE)

我只能想到从分组 df 开始来自 id如下:
library(dplyr)
dfnew <- df %>% group_by(id)

但是,我不确定如何从这里继续。我应该继续使用 filter函数或 slice ?如果是这样,如何?

最佳答案

使用 slice 的替代方案来自 dplyr是定义以下递归函数:

library(dplyr)
f <- function(d, ind=1) {
ind.next <- first(which(difftime(d,d[ind], units="days") > 90))
if (is.na(ind.next))
return(ind)
else
return(c(ind, f(d,ind.next)))
}

此函数作用于 dateind = 1 开始的列.然后它找到下一个索引 ind.next那就是 first日期距 ind 索引的日期大于 90 天(至少 91 天)的索引.注意如果没有这样的 ind.next , ind.next==NA我们只是返回 ind .否则,我们递归调用 find.next 开始并返回其与 ind 连接的结果.此函数调用的最终结果是至少间隔 91 天的行索引。

有了这个函数,我们可以做到:
result <- df %>% group_by(id) %>% slice(f(as.Date(date, format="%Y-%m-%d")))
##Source: local data frame [4 x 3]
##Groups: id [2]
##
## id var1 date
## <int> <chr> <chr>
##1 1 A 2006-01-01
##2 1 C 2006-06-02
##3 1 E 2007-12-01
##4 2 F 2007-04-20

此函数的使用假设 date列按每个 id 升序排序团体。如果没有,我们可以在切片之前对日期进行排序。不确定此操作的效率或 R 中递归调用的危险。希望 David Arenburg 或其他人可以对此发表评论。

根据 David Arenburg 的建议,最好转换 date首先到 Date 类而不是按组:
result <- df %>% mutate(date=as.Date(date, format="%Y-%m-%d")) %>%
group_by(id) %>% slice(f(date))
##Source: local data frame [4 x 3]
##Groups: id [2]
##
## id var1 date
## <int> <chr> <date>
##1 1 A 2006-01-01
##2 1 C 2006-06-02
##3 1 E 2007-12-01
##4 2 F 2007-04-20

关于r - 如何根据R中行之间的日期差异过滤行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317354/

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