【问题标题】:R dates comparison using loopR日期比较使用循环
【发布时间】:2021-12-13 16:04:51
【问题描述】:

我有一个包含 1 个日期列的数据框(转换为.Date)。

我正在尝试编写一个循环来在另一列中创建一个值,以“检查”死亡日期与修复值(今天的日期)的比较。

fix_date= as.Date(2021-10-28)

for (i in 1:length(df$Death.date)) {
  if (df$Death.date[i] < as.Date(fix_date)){
    df$death_check[i]<-"good"
  }
}

所以对于每一行如果 Death.date fix_date,用“good”填充 death_check 列。

它给了我这个错误代码:

if (new_possible_population$Death.date[i]

这是为有关日期值的循环编码的正确方法吗?或者有比使用循环更好的方法吗?

【问题讨论】:

  • 从错误消息中听起来就像您在 df$Death.date 中缺少值一样。你检查了吗?
  • 请注意,这可以通过矢量化完成,无需显式循环。它可能会导致更好看的代码:df$death_check[df$Death.date &gt; fix_date] &lt;- "good"。而且您第二次不必要地调用as.Date(),您已经使用as.Date() 创建了fix_date,尽管您可能也缺少""s。

标签: r loops as.date


【解决方案1】:

您肯定想为此使用矢量化函数,请查看dplyr 包:

df %>%
  mutate(death_check = case_when(Death.date < as.Date("2021-10-28") ~ "good"))

如您所见,我也在日期前后添加了"",这是必要的。如果您的 df$Death.date 实际上不是 Date 格式,您也可以在此处进行更改。

【讨论】:

    【解决方案2】:
    library(data.table)
    df <- data.table(
      Death.date = sample(seq(as.Date("2020-01-01"), by = "month", length.out = 25))
    )
    
    # just a TRUE for "good" which makes FALSE "bad"
    df[, death_check_1 := Death.date < Sys.time()]
    
    # written "good"
    df[Death.date < Sys.time(), death_check_2 := "good"]
    

    【讨论】:

      【解决方案3】:

      这是另一个使用 sapplyifelse 的选项:

      # make df using Merijn's code
      df <- data.frame(Death.date = sample(seq(as.Date("2020-01-01"), 
                       by = "month", 
                       length.out = 25)))
      
      # set the date to check against
      fix_date <- as.Date("2021-10-28")
      
      # make the comparison, return "good" or NA
      df$death_check <- sapply(df$Death.date, function(x) {
                               ifelse(x < fix_date, "good", NA)
                               })
      
      df
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-25
        • 2023-03-14
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        相关资源
        最近更新 更多