【问题标题】:Creating a column based on the date range in R根据 R 中的日期范围创建列
【发布时间】:2018-10-23 01:36:59
【问题描述】:

我需要根据另一列中的日期范围创建一列 例子 : 我需要根据“日期”列创建一个“拆分”列,如下面的数据所示。 前 5 天为 1,接下来的 5 天为 2,依此类推。

我不能使用 if else 条件来创建新列,因为日期范围很大,几乎涵盖了 10 年

    Date    ID  split
1/1/2017    ABC 1
1/2/2017    ABC 1
1/3/2017    ABC 1
1/4/2017    ABC 1
1/5/2017    ABC 1
1/6/2017    ABC 2
1/7/2017    ABC 2
1/8/2017    ABC 2
1/9/2017    ABC 2
1/10/2017   ABC 2
1/1/2017    xyz 1
1/2/2017    xyz 1
1/3/2017    xyz 1
1/4/2017    xyz 1
1/5/2017    xyz 1
1/11/2017   EFG 3
1/12/2017   EFG 3
1/13/2017   EFG 3
1/14/2017   EFG 3
1/15/2017   EFG 3

【问题讨论】:

  • 我们从一月穿越到二月会发生什么?行号是不断增加,还是重置?
  • 如果我写了一个很好但很长的解决方案查询,截取了它的截图,并添加了该图像作为答案,你会为不必要的转录工作而烦恼吗? 请不要使用数据图像,只需将一些数据复制/粘贴到问题中并使用工具栏中的{} 按钮对其进行格式化。 ps:本站创建固定ascii表ozh.github.io/ascii-tables
  • 给定图片的数据可能会提供信息,但很少会导致快速回答,因为人们认为您希望他们为他们输入数据。我们大多数人都将其视为您的责任。我们不认为它是minimal reproducible example。您的问题的另一个严重缺陷是缺乏任何编码努力。最后,这类问题之前应该已经回答过了,但是如果你搜索一下,看到之前没有回答的问题的链接会更有说服力。

标签: r date


【解决方案1】:

为了澄清我们对所需内容的理解,我们假设 ID 列不参与计算,我们只是希望将 1 分配给最低的 5 个唯一日期,将 2 分配给下一个最低的 5 个唯一日期,依此类推上。在问题中,最小值和最大值之间的每个日期至少出现一次,因此我们假设情况就是如此。就显示的数据而言,我们希望将 1 分配给 2017 年 1 月的前 5 个日历日,将 2 分配给 2017 年 1 月的接下来 5 个日历日,将 3 分配给 2017 年 1 月的接下来 5 个日历日。

我们可以将split 计算为自第一天以来的天数,除以 5,取整数部分并加 1。

没有使用任何包。

d <- as.Date(DF$Date, format = "%m/%d/%Y")
transform(DF, split = as.numeric(d - min(d)) %/% 5 + 1)

给予:

        Date  ID split
1   1/1/2017 ABC     1
2   1/2/2017 ABC     1
3   1/3/2017 ABC     1
4   1/4/2017 ABC     1
5   1/5/2017 ABC     1
6   1/6/2017 ABC     2
7   1/7/2017 ABC     2
8   1/8/2017 ABC     2
9   1/9/2017 ABC     2
10 1/10/2017 ABC     2
11  1/1/2017 xyz     1
12  1/2/2017 xyz     1
13  1/3/2017 xyz     1
14  1/4/2017 xyz     1
15  1/5/2017 xyz     1
16 1/11/2017 EFG     3
17 1/12/2017 EFG     3
18 1/13/2017 EFG     3
19 1/14/2017 EFG     3
20 1/15/2017 EFG     3

注意

我们假设以下数据具有可重复性:

Lines <- "Date    ID
1/1/2017    ABC
1/2/2017    ABC
1/3/2017    ABC
1/4/2017    ABC
1/5/2017    ABC
1/6/2017    ABC
1/7/2017    ABC
1/8/2017    ABC
1/9/2017    ABC
1/10/2017   ABC
1/1/2017    xyz
1/2/2017    xyz
1/3/2017    xyz
1/4/2017    xyz
1/5/2017    xyz
1/11/2017   EFG
1/12/2017   EFG
1/13/2017   EFG
1/14/2017   EFG
1/15/2017   EFG"

DF <- read.table(text = Lines, header = TRUE, as.is = TRUE, strip.white = TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多