【问题标题】:Create index for this condition using data.table使用 data.table 为此条件创建索引
【发布时间】:2017-10-13 23:16:52
【问题描述】:

如何从天数中获取开始日期和结束日期(累积)

      Variable A  days  stardate  enddate(cumulative) 
          A        2       0           2
          A        3       2           5
          B        4       5           9
          A        3       0           3
          B        8       3          11

【问题讨论】:

  • 我猜你想用实际日期来做这个?请确认。
  • 您的问题一开始就含糊不清,后来变得含糊不清。以上是您想要的输出,至少这是我的假设。但是,当您取第 4 天(第 3 行)并减去第 2 天(第 1 行)时,您无法在第 1 行获得 0 的开始日期。改写你的问题。

标签: r data.table


【解决方案1】:

如果我理解正确,您希望天数 + 开始日期位于结束日期列中。然后你可以简单地使用这个:

df <- data.table(Variable=c("A", "A", "B", "A", "B"), days=c(2,3,4,3,8), startdate=c(0,2,5,9,12), enddate=c(0))
df$enddate <- as.numeric(df$days + df$startdate)

【讨论】:

  • 不完全是,只有变量A和days来获取startdate和endate
  • @DFR 当具有字母分类值和整数时,您应该如何计算数值或日期时间。你能解释得更透彻吗?您问题中的表格是所需的输出还是输入?你能通过更新你的问题告诉我你的确切意思吗?
  • 我的错误,它总是从A开始然后在B结束作为一个块来计算开始日期和结束日期
  • @DFR 所以你想要从 A 到 B 的跨度?天数是它开始的日期,还是使用的天数?如果它是它开始的那一天,我认为更有意义?那么 A 从第 1 行的第 2 天开始,并从第 3 天的第 2 行再次开始。第 1 行和第 2 行都在第 3 行结束?那么第 1 行需要 4 -2 天,第 2 行需要 4 -3 天?我理解正确吗?
  • 累计跨度 A 到 B 的天数。以此类推
【解决方案2】:

使用cumsumshift 的组合:

dt1[, grp := cumsum(shift(Variable, fill='A')=='B')
    ][, startdate := cumsum(shift(days, fill = 0)), grp
      ][, enddate := startdate + days][]

给出:

> dt1
   Variable days grp startdate enddate
1:        A    2   0         0       2
2:        A    3   0         2       5
3:        B    4   0         5       9
4:        A    3   1         0       3
5:        B    8   1         3      11

使用过的数据:

dt1 <- data.table(Variable = c("A","A","B","A","B"), days = c(2,3,4,3,8))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 2014-03-06
    • 2020-10-11
    • 2018-04-30
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多