【问题标题】:replace historical data of a data.frame with the most recent year data in R?用R中最近一年的数据替换data.frame的历史数据?
【发布时间】:2020-10-16 10:43:06
【问题描述】:

我想用来自Ob2020 的数据替换FakeData 中所有年份的Jan 01 to Jun 25,用于我的data.frametwo variables (Level & Flow)。这是我已经开始并正在寻找实现目标的建议。

library(tidyverse)
library(lubridate)

set.seed(1500)

FakeData <- data.frame(Date = seq(as.Date("2010-01-01"), to = as.Date("2018-12-31"), by = "days"),
                       Level = runif(3287, 0, 30), Flow = runif(3287, 1,10))

Ob2020 <- data.frame(Date = seq(as.Date("2020-01-01"), to = as.Date("2020-06-25"), by = "days"),
                     Level = runif(177, 0, 30), Flow = runif(177, 1,10))

【问题讨论】:

  • 在你的例子中,一些 Jan01 到 Jun25 在 0b2020 中没有对应的值。如果是这样的话,我想应该保持这样吧?
  • 是的 - 这是因为 2020 年的 2 月(闰年)多了一天。
  • 我添加了一个解决方案,data.table 加入也许有帮助

标签: r dataframe replace tidyverse lubridate


【解决方案1】:

这是一种使用dplyrlubridate 的方法:

library(dplyr)
library(lubridate)

FakeData %>%
  mutate(day = day(Date), month = month(Date)) %>%
  left_join(Ob2020 %>%
              mutate(day = day(Date), month = month(Date)), 
              by = c('day', 'month')) %>%
   mutate(Level = coalesce(Level.y, Level.x), 
          Flow = coalesce(Flow.y, Flow.x)) %>%
  select(Date = Date.x, Level, Flow)

     

【讨论】:

    【解决方案2】:

    如果您不介意data.table 解决方案,这里是更新加入:

    library(data.table)
    #extract year and month of the date
    setDT(FakeData)[, c("day", "mth") := .(mday(Date), month(Date))]
    setDT(Ob2020)[, c("day", "mth") := .(mday(Date), month(Date))]
    
    #print to console to show old values        
    head(FakeData)
    head(Ob2020)
    
    cols <- c("Level", "Flow")
    FakeData[Ob2020[mth<=6L & day<=25], on=.(day, mth),
        (cols) := mget(paste0("i.", cols))]
    
    #print to console to show new values
    head(FakeData)
    

    【讨论】:

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