【问题标题】:Use ifelse to assign Date in new factor使用 ifelse 在新因子中分配日期
【发布时间】:2020-07-16 17:04:48
【问题描述】:

我想为数据框中的新因素分配不同的日期,这取决于特定观察的年份。这是我所拥有的:

Date     Location
2014-10-30     AB1
2014-09-02     AB3
2015-10-15     AB1
2016-11-02     AB4
etc. (191K observations)

这就是我想要得到的,因为我的参考日期为 2014-08-14、2016-09-16 等与观察日期的年份相关联。对于那些没有参考日期的年份,我希望将值设置为 NA。

Date     Location     Reference
2014-10-30     AB1     2014-08-14
2014-09-02     AB3     2014-08-14
2015-10-15     AB1     NA
2016-11-02     AB4     2016-09-16
etc. (191K observations)

我知道如何编写 ifelse 语句来指定将日期分配给特定年份,但基于“日期”标识特定年份并根据该值匹配参考日期的语法对我来说并不明显。我真的很感激关于这个问题的一些指导。谢谢。道格

【问题讨论】:

    标签: r date if-statement


    【解决方案1】:

    有点棘手。在base-R

    Reference.year <- format(Reference,"%Y")
    dates.year <- format(df$Date,"%Y")
    
    df$Location <- NA
    df$Location[dates.year %in% Reference.year] <- do.call(c,lapply(dates.year,function(x) paste(Reference[Reference.year %in% x])))
    
            Date   Location
    1 2014-10-30 2014-08-14
    2 2014-09-02 2014-08-14
    3 2015-10-15       <NA>
    4 2016-11-02 2016-09-16
    

    数据:

    df <- read.table(text='Date     Location
    2014-10-30     AB1
    2014-09-02     AB3
    2015-10-15     AB1
    2016-11-02     AB4',header=T,stringsAsFactors=F)
    
    Reference <- as.Date(c("2014-08-14", "2016-09-16"))
    df$Date <- as.Date(df$Date)
    

    【讨论】:

    • 丹尼尔,感谢您的回复。我在最后一步收到此错误来运行您的代码:要替换的项目数不是替换长度的倍数
    • 这是我的代码:Records2$AerialDates
    【解决方案2】:

    您可以使用 tidyverse 和 lubridate(轻松提取年份)。具体来说,您可以使用join 方法将日期合并到引用而不是ifelse。制作一个年份列来排列数据将对此有所帮助。见下文:

    # sample data
    data <- tibble(Date = c("2014-10-30", "2014-09-02", "2015-10-15", "2016-11-02"), Location = c("AB1", "AB3", "AB1", "AB4"))
    
    reference <- tibble(Reference = c("2014-08-14", "2016-09-16"))
    
    library(lubridate)
    
    # add year column to year reference
    year_ref <- mutate(reference, year = year(Reference))
    
    # add year column to data and left join to reference
    data_with_ref <- data %>%
      mutate(year = year(Date)) %>%
      left_join(year_ref, by = "year") %>%
      select(-year)
    

    【讨论】:

      【解决方案3】:

      当我第一次需要做同样的事情时,这也引起了我的注意。

      naDate <- structure(NA_real_, class="Date")
      

      是你所需要的(假设你想将ReferenceDate 设置为NA)...

      编辑

      这对我有用

      df <- read.table(text='Date     Location
      2014-10-30     AB1
                       2014-09-02     AB3
                       2015-10-15     AB1
                       2016-11-02     AB4',header=T,stringsAsFactors=F)
      
      df <- df %>% 
               mutate(
                 Reference=ifelse(
                             row_number() == 3, 
                             structure(NA_real_, class="Date"), 
                             Date
                           )
               )
      df
              Date Location  Reference
      1 2014-10-30      AB1 2014-10-30
      2 2014-09-02      AB3 2014-09-02
      3 2015-10-15      AB1       <NA>
      4 2016-11-02      AB4 2016-11-02
      

      如果它不适合您,请您发布更多详细信息吗? [输入数据,您尝试的代码,错误消息。谢谢。]

      【讨论】:

      • Limey,我将您的代码添加到 Daniel 的 'df$Location
      【解决方案4】:

      基础 R 解决方案:

      df$Reference <- as.Date(reference$Reference)[match(as.Date(df$Date, "%Y"), 
                        as.Date(reference$Reference, "%Y"))]
      

      数据:

      df <- data.frame(Date = c("2014-10-30", "2014-09-02", "2015-10-15", "2016-11-02"), 
                       Location = c("AB1", "AB3", "AB1", "AB4"))
      
      reference <- data.frame(Reference = c("2014-08-14", "2016-09-16"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多