R 查找并删除不同ID中的日期顺序间隙

R 查找并删除不同ID中的日期顺序间隙,r,sorting,difference,days,R,Sorting,Difference,Days,我有一个数据框,其中包含来自continuus days的不同ID和obervations。如果连续几天没有一个ID的数据,我想删除它们 我使用diff(days)函数来显示日与日之间的差异,但我只能对一个ID执行此操作 我的df看起来像这样: ani_id_year days 1 ID468_2006 2006-04-01 2 ID468_2006 2006-04-02 3 ID468_2006 2006-04-03 4 ID468_2006 2006-04-04 5

我有一个数据框,其中包含来自continuus days的不同ID和obervations。如果连续几天没有一个ID的数据,我想删除它们

我使用
diff(days)
函数来显示日与日之间的差异,但我只能对一个ID执行此操作

我的df看起来像这样:

  ani_id_year       days
1  ID468_2006 2006-04-01
2  ID468_2006 2006-04-02
3  ID468_2006 2006-04-03
4  ID468_2006 2006-04-04
5  ID468_2006 2006-04-05
6  ID599_2006 2006-03-06
7  ID599_2006 2006-03-14
8  ID599_2006 2006-03-15
9  ID599_2006 2006-03-16

因此,我可以看到,ID599_2006中存在7天的间隔,如果gab为=,我想自动删除它。如果您希望删除每个ID的所有条目,这将是一种方法

库(tidyverse)
df%集团成员(ani id年)%>%
变异(差异=as.numeric(天-滞后(天)))%>%
变异(to_delete=ifelse)(最大值(差值,na.rm=TRUE)%
过滤器(要删除==“保留”)
#>#A tibble:5 x 4
#>#群体:ani_id_年[1]
#>要删除的年度天数差异
#>                         
#>1 ID468_2006-04-01不适用
#>2 ID468_2006-04-02 1保留
#>3 ID468_2006-04-03 1保留
#>4 ID468_2006-04-04 1保持
#>5 ID468_2006-04-05 1

由(v0.3.0)于2020-08-18创建。如果您希望删除每个ID的所有条目,这将是一种方法

库(tidyverse)
df%集团成员(ani id年)%>%
变异(差异=as.numeric(天-滞后(天)))%>%
变异(to_delete=ifelse)(最大值(差值,na.rm=TRUE)%
过滤器(要删除==“保留”)
#>#A tibble:5 x 4
#>#群体:ani_id_年[1]
#>要删除的年度天数差异
#>                         
#>1 ID468_2006-04-01不适用
#>2 ID468_2006-04-02 1保留
#>3 ID468_2006-04-03 1保留
#>4 ID468_2006-04-04 1保持
#>5 ID468_2006-04-05 1

由(v0.3.0)于2020年8月18日创建

subset(df, !ani_id_year %in% ani_id_year[c(F, diff(days) > 7)])
library(dplyr)

2.
dplyr
解决方案

subset(df, !ani_id_year %in% ani_id_year[c(F, diff(days) > 7)])
library(dplyr)
  • 选项1

  • 选项2


输出


数据


df1.
base
solution

subset(df, !ani_id_year %in% ani_id_year[c(F, diff(days) > 7)])
library(dplyr)

2.
dplyr
解决方案

subset(df, !ani_id_year %in% ani_id_year[c(F, diff(days) > 7)])
library(dplyr)
  • 选项1

  • 选项2


输出


数据


df带有
data.table的选项

library(data.table)
setDT(df)[, .SD[!any(diff(days) > 7)], (ani_id_year)]
#  ani_id_year       days
#1:  ID468_2006 2006-04-01
#2:  ID468_2006 2006-04-02
#3:  ID468_2006 2006-04-03
#4:  ID468_2006 2006-04-04
#5:  ID468_2006 2006-04-05
数据
df带有
data.table的选项

library(data.table)
setDT(df)[, .SD[!any(diff(days) > 7)], (ani_id_year)]
#  ani_id_year       days
#1:  ID468_2006 2006-04-01
#2:  ID468_2006 2006-04-02
#3:  ID468_2006 2006-04-03
#4:  ID468_2006 2006-04-04
#5:  ID468_2006 2006-04-05
数据
df问题不是很清楚:如果存在间隙,您是想删除所有具有相同ID的行,还是只想删除该行
ID599_2006;2006-03-06
。此外,最好是使用
dput
发布至少部分数据,以便示例“开箱即用”。您好,很抱歉我理解错误,如果存在大于x的间隙,我将删除整个id。明天我将尝试您的解决方案和所有其他解决方案,感谢您的帮助!我将签出dput并尝试下次运行它以使ist更容易。很抱歉,问题不太清楚:是否要删除具有相同id的所有行ID是否存在间隙,或者是否只想删除该行
ID599_2006;2006-03-06
。此外,最好使用
dput
发布至少部分数据,以便示例“开箱即用”。您好,我很抱歉理解错误,如果存在大于x的间隙,我将删除整个id。明天我将尝试您的解决方案和所有其他解决方案,感谢您的帮助!我将签出dput,并尝试下次运行它以使ist更容易。对不起。我认为应该删除的id是
ID599
,而不是
ID468
。是的,我的坏。“保留”和“删除”的顺序不正确。我已经编辑了答案。但是,下面发布了一些更好的解决方案。我认为应该删除的id是
ID599
,而不是
ID468
。是的,我的坏。“保留”和“删除”我已经编辑了答案。但是,下面已经发布了一些更好的解决方案。