【发布时间】: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 <- j + 1。对于这种情况,您还可以使用Daily_Streamflow %>% 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