用R中最近一年的数据替换data.frame的历史数据?
我想用我的用R中最近一年的数据替换data.frame的历史数据?,r,dataframe,replace,tidyverse,lubridate,R,Dataframe,Replace,Tidyverse,Lubridate,我想用我的data.frame的两个变量(级别和流量)的Ob2020中的数据替换01年1月至6月25日期间中所有年份的FakeData。以下是我的起点,我正在寻找实现我的目标的建议 library(tidyverse) library(lubridate) set.seed(1500) FakeData <- data.frame(Date = seq(as.Date("2010-01-01"), to = as.Date("2018-12-31"
data.frame的两个变量(级别和流量)
的Ob2020
中的数据替换01年1月至6月25日期间中所有年份的FakeData
。以下是我的起点,我正在寻找实现我的目标的建议
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))
库(tidyverse)
图书馆(lubridate)
种子集(1500)
FakeData如果您不介意使用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)
库(data.table)
#提取日期的年份和月份
setDT(伪造数据)[,c(“日”、“月”):=(日(日)、月(日))]
setDT(Ob2020)[,c(“日”、“月”):=(日(日)、月(日))]
#打印到控制台以显示旧值
主管(伪造数据)
总目(Ob2020)
cols这里有一种使用dplyr
和lubridate
的方法:
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)
在您的示例中,一些Jan01到Jun25在0b2020中没有相应的值。如果是这样的话,我想应该是这样的吧?是的-这是因为2020年在2月(闰年)有一个额外的一天。我添加了一个带有数据的解决方案。table
join可能会有帮助