【问题标题】:Count the number of days from a specific date and data range从特定日期和数据范围计算天数
【发布时间】:2016-05-31 14:30:52
【问题描述】:

我想计算在前5 天的第 1 列 (ncol = 1) 定义的特定日期,value 出现 >20 的次数。比如日期1997.05.25值出现了多少次>201997.05.21

这里是变量:

value <- c(37,19.75,19.5,14.5,24.75,25,25.5,19.75,19.75,14.25,21.25,21.75,17.5,16.25,14.5,
               14.5,14.75,9.5,11.75,15.25,14.25,16.5,13.5,18.25,13.5,11.25,10.75,12,8.5,
               9.75,14.75)
    Date <- c("1997-05-01","1997-05-02","1997-05-03","1997-05-04","1997-05-05",
              "1997-05-06","1997-05-07","1997-05-08","1997-05-09","1997-05-10",
              "1997-05-11","1997-05-12","1997-05-13","1997-05-14","1997-05-15",
              "1997-05-16","1997-05-17","1997-05-18","1997-05-19","1997-05-20",
              "1997-05-21","1997-05-22","1997-05-23","1997-05-24","1997-05-25",
              "1997-05-26","1997-05-27","1997-05-28","1997-05-29","1997-05-30",
              "1997-05-31")
    ncol <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)`

    data <- data.frame(value, Date, ncol)

    library(data.table)

    setDT(data)[, ncol := ifelse(Date %in% c("1997-05-05","1997-05-11","1997-05-14",
                                             "1997-05-18","1997-05-25"), ncol+1, 0) ]

如何做到最好?非常感谢您的帮助。

这是我的预期结果:

 1. value Date  ncol newcol
 2. 37.00 1997-05-05 1 2
 3. 19.75 1997-05-11 1 2
 4. 19.50 1997-05-14 1 2
 5. 14.50 1997-05-18 1 0
 6. 24.75 1997-05-25 1 0

【问题讨论】:

  • 添加您的预期输出可能会很好,因为从答案来看,它是模棱两可的
  • 非常感谢@docendo discimus。把我想得到的结果。

标签: r date count


【解决方案1】:

如果我理解正确,您可以使用Reduceshift

library(data.table)
DT <- data.table(value, Date)

DT[, ncol := Reduce(`+`, shift(value > 20, 1:5, fill = 0))]

这是做什么的:对于每一行 DT,它计算前 5 行中 value 列大于 20 的次数,并将其写入 ncol 列。


如果您想从前 5 天更改此 5 行“窗口”以包括当天 + 前 4 行,您可以将代码更改为:

DT[, ncol := Reduce(`+`, shift(value > 20, 0:4, fill = 0))]

【讨论】:

  • 不错!但我猜这个问题想要总结前五天(而不是行)中value &gt; 20 的案例数量。在我看来,这看起来像是一个通过移动间隔总结 data.table 的问题
  • @RafaelPereira,也许你是对的。不过我不确定,这就是为什么我要求 OP 在问题中提供他们想要的输出。
  • 太棒了!就是这样。谢谢。我想计算包括当天。但是,并非所有行都必须是具有数字 1 列的天(特定日期)。一个问题,我怎样才能只选择想要创建一个带有日期和 newcol 的新表的行?
  • @Gustavo,我在您的示例数据中没有看到任何 1,所以我无法帮助您。
【解决方案2】:

这是使用dplyr的解决方案:

library(dplyr)

data$Date <- as.Date(data$Date)

data %>%
    filter(between(Date, "1997-05-01", "1997-05-21"),
          value > 20) %>%
    nrow()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2011-02-05
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2013-05-29
    • 2016-09-08
    相关资源
    最近更新 更多