【问题标题】:FOR loop to calculate difference on dates in RFOR循环计算R中日期的差异
【发布时间】:2021-01-05 06:09:37
【问题描述】:

我正在尝试以天为单位计算数据框中两个日期之间的差异,并将其保存在同一数据框的另一列中,称为滞后。这是我的代码,但它不起作用:

Daily_Streamflow$Date
Daily_Streamflow$lag[1] <- 0
j <- 2
for (j in length(Daily_Streamflow$Date)) {
 Daily_Streamflow$lag[j] <-  as.numeric(difftime(Daily_Streamflow$Date[j],Daily_Streamflow$Date[j-1], unit=c("days")))
 j <- j + 1
}

这是我的数据框的外观:

当我将第一天的差值 Daily_Streamflow$lag[1] 设置为 0 时,所有剩余值都设置为 0。如果我将此值保留为空,则该列的所有值都设置为 NA。似乎代码将第一个滞后的值放在所有列中,省略了 for 内的函数,尽管 j 值增加并且循环运行。

【问题讨论】:

  • 使用for (j in 2:length(df$Date)) 循环时,您不需要j &lt;- j + 1。对于这种情况,您还可以使用Daily_Streamflow %&gt;% mutate(lag = replace_na(as.numeric(Date - lag(Date)), 0)) 完全避免循环。这假设您的日期列保存为日期对象。如果不是,请先将其转换为as.Date()replace_na() 函数还需要库 tidyr
  • 如果不指定位置,mutate 函数如何仅通过 Date - lag(Date) 知道您要计算该日期与前一个日期之间的差异?
  • 还有 tydr 包,它不适用于 R 4.0.2 的最新版本
  • tidyr,不是 tydr。它是 tidyverse 的一部分。 lag 会将整列移动 +1 行。而铅将移动一列-1行。在您的控制台中测试 lag(Daily_Streamflow$Date) 以将其可视化。

标签: r loops for-loop difference datediff


【解决方案1】:

由于您没有为我们提供数据,因此您必须自己测试:

Daily_Streamflow$Date
Daily_Streamflow$lag[1] <- 0
for (j in 2:length(Daily_Streamflow$Date)) { # add 2: to create a sequence
  Daily_Streamflow$lag[j] <-  as.numeric(difftime(Daily_Streamflow$Date[j],Daily_Streamflow$Date[j-1], units=c("days")), units = "days") # change 'unit' to 'units' and add 'units' attribute to the 'as.numeric' function as well
  j <- j + 1
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多