【问题标题】:Find Date in Data Frame in R在 R 中的数据框中查找日期
【发布时间】:2021-03-30 01:56:48
【问题描述】:

我正在尝试使用日期列表在数据框中查找相同的日期,并使用 ifelse 循环添加新列。代码如下:

library(lubridate)
df <- tibble(DateCol = seq(ymd("2021-01-01"),ymd("2021-05-31"),"days"))

df2 <- c("2021-02-04","2021-02-07","2021-02-17","2021-02-25")

for (i in 1:length(df$DateCol)) {
  if (df$DateCol[i] == df2) {
    df$ValueCol[i] <- "1"
    } else {
      df$ValueCol[i] <- "0"
      return(i)
    }
  }

我得到的最终 df 只有 df2 的第一个日期是 df$ValueCol 中的 1。不知道如何使这个循环工作,似乎 df$DateCol[i] == df2 部分有一些错误。

【问题讨论】:

    标签: r dataframe if-statement


    【解决方案1】:

    您可以在没有循环的情况下执行此操作。

    df$ValueCol <- as.integer(df$DateCol %in% as.Date(df2))
    df
    

    as.integer 比使用带有 1 和 0 作为输出的 ifelse 更快。

    df$ValueCol <- ifelse(df$DateCol %in% as.Date(df2), 1, 0)
    

    您的循环可以通过使用%in% 而不是== 来纠正,因为我们使用%in% 来比较多个值。

    library(tibble)
    library(lubridate)
    
    df <- tibble(DateCol = seq(ymd("2021-01-01"),ymd("2021-05-31"),"days"))
    
    df2 <- as.Date(c("2021-02-04","2021-02-07","2021-02-17","2021-02-25"))
    df$ValueCol <- NA
    for (i in 1:length(df$DateCol)) {
      if (df$DateCol[i] %in% df2) {
        df$ValueCol[i] <- 1
      } else {
        df$ValueCol[i] <- 0
      }
    }
    

    【讨论】:

      【解决方案2】:

      或者你可以尝试使用 dplyr

      library(dplyr)
      library(magrittr)
      df <- tibble(DateCol = seq(ymd("2021-01-01"),ymd("2021-05-31"),"days"))
      
      df2 <- ymd("2021-02-04","2021-02-07","2021-02-17","2021-02-25")
      df3 <- df %>% mutate(ValueCol = if_else(DateCol %in% df2, 1, 0))
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-08
        • 2019-04-28
        • 2020-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多