【问题标题】:Group date variable when dates are close日期接近时分组日期变量
【发布时间】:2023-03-24 05:55:01
【问题描述】:

我正在尝试编写一个函数或使用cut 在这些日期关闭时将分组变量分配给某些日期数据(关闭的用户定义)。例如,我想为在连续日期收集的一些样本创建一个公共分组变量。我在想cut 可以在这里工作,但后来我意识到cut 在变量接近时不会对变量进行分组,而是根据序列创建一系列组。

所以以这个数据框为例:

df <- structure(list(Num = c(0.888401849195361, 0.185766335576773, 
0.493163562379777, 0.13070688676089, 0.484760325402021, 0.603240836178884, 
0.893201333936304, 0.641203448642045, 0.16957180458121, 0.0101411847863346
), Date = structure(c(10592, 10597, 10598, 10605, 10606, 10608, 
10609, 10616, 10617, 10618), class = "Date"), day = c(1L, 6L, 
7L, 14L, 15L, 17L, 18L, 25L, 26L, 27L)), .Names = c("Num", "Date", 
"day"), row.names = c(NA, -10L), class = "data.frame")

如果要应用剪切功能,因为我理解它的用法如下:

df$cutVar <- cut(df$day, breaks= seq(0, 31, by = 1), right=TRUE) 

我会留下一个范围,该范围正好穿过我希望组合在一起的值。例如,第 6 和第 7 应根据彼此的接近程度分组在一起。类似于 14th 和 15th 等等。

> df
          Num       Date day  cutVar
1  0.88840185 1999-01-01   1   (0,1]
2  0.18576634 1999-01-06   6   (5,6]
3  0.49316356 1999-01-07   7   (6,7]
4  0.13070689 1999-01-14  14 (13,14]
5  0.48476033 1999-01-15  15 (14,15]
6  0.60324084 1999-01-17  17 (16,17]
7  0.89320133 1999-01-18  18 (17,18]
8  0.64120345 1999-01-25  25 (24,25]
9  0.16957180 1999-01-26  26 (25,26]
10 0.01014118 1999-01-27  27 (26,27]

所以这里的基本问题是如何对连续变量(在本例中为日期)进行分组,以便将关闭(由用户定义)数字组合在一个因子范围内?

【问题讨论】:

  • 对于连续日期组,rle 可能非常有用。由于传递属性,在我看来,“亲密”的其他定义很快就会成为问题。
  • 你能粘贴一个你想要的输出示例(或者是最后的df)吗?您只想合并 2 个相邻的行吗?例如,如果 1 “接近” 2,& 2 接近 3,...,19 接近 20,但 1 与 20 不“接近”,该怎么办?数据是否已经存在于一个不变的集合中,还是会随着时间的推移不断添加新数据?
  • @joran 我完全同意这一点。但是,在我的情况下(示例数据可能无法捕获),这不是问题。这是历史采样数据,有人在一两天内收集了数据,然后等了一个月,然后做了同样的事情。是否可以概述rle的用法?
  • @boshek 我想到了一种类似于this 的方法,尽管看起来rle 并没有必要。 (您需要对日期的整数表示进行操作。)

标签: r date grouping


【解决方案1】:

这是你想要的吗?其中3 是我为方便选择的阈值。它可以是您喜欢的任何数字:

df$group <- cumsum(c(1, diff.Date(df$Date)) >= 3)
df
          Num       Date day group
1  0.88840185 1999-01-01   1     0
2  0.18576634 1999-01-06   6     1
3  0.49316356 1999-01-07   7     1
4  0.13070689 1999-01-14  14     2
5  0.48476033 1999-01-15  15     2
6  0.60324084 1999-01-17  17     2
7  0.89320133 1999-01-18  18     2
8  0.64120345 1999-01-25  25     3
9  0.16957180 1999-01-26  26     3
10 0.01014118 1999-01-27  27     3

【讨论】:

  • 我不完全理解这里的用法,因为我无法普遍应用它。例如,如果我添加另一个日期序列 (Date2) 并基于这些日期 (Group2) 创建一个分组,这些日期 - 仅隔一天 - 不会组合在一起:df$Date2 &lt;- structure(c(1118620800, 1118620800, 1118620800, 1118707200, 1118707200, 1118707200, 1118707200, 1118707200, 1118707200, 1118707200), class = c("POSIXct", "POSIXt" ), tzone = "UTC")df$Group2 &lt;- cumsum(c(1, diff.Date(df$Date2)) &gt;= 1)。关于我如何能够纠正这个问题的任何想法?
  • 因为您选择的阈值是1,这意味着您只会对同一日期进行分组。如果要将具有一天差异的日期分组,请将阈值设置为高于 1。同样,如果组内也考虑了两天的差异,则将阈值设置为高于两天等。
  • 另一个问题是,在应用diff.Date 之前,您需要将Date 列转换为Date 类,以便diff.Date 将返回日期差异而不是秒。所以df$Date2 &lt;- as.Date(df$Date2).
  • 见上面的cmets。你Date2 属于POSIXct 类。
  • 试试 df %>% group_by(group) %>% mutate(new_name=Date[1])。
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2013-10-18
  • 2021-01-01
  • 2023-02-07
  • 2013-12-18
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多