如果日期与 R 中的另一个数据框匹配,则获取最近 3 天的最大值?
get max maximum value of last 3 days if date matches from another dataframe in R?
我有两个数据框
df1= data.frame( ts = c('2020-01-15', '2020-01-16' , '2020-01-17', '2021-01-14', '2021-01-15','2021-
01-16','2021-01-24','2021-01-25','2021-01-26'),
aa_h=c(1,2,3,6,4,5,7,9,8),
bh= c(12,13,14,11,11,11,122,12,56))
df2_mx=data.frame( ts = c('2020-01-17', '2021-01-16' , '2021-01-26'),
aa= NA)
现在我想比较df1中df2_mx的日期,如果匹配,我想要最后一个aa_h的最大值两个和当天并将其插入 df2_mx
的“aa”列
例子
第 1 行,即 df2_mx 的“2020-01-17”将匹配 df1 的第 3 行,它将在 2 天以上查找并获得值 which_max(c(1, 2,3))--> 3 并将其插入 df2_mx .
的“aa”列
预期输出:
df2_mx=data.frame( ts = c('2020-01-17', '2021-01-16' , '2021-01-26'),
aa= c(3,6,9))
试用码
n=1
for (i in 1:nrow(df1)){
ifelse(which(as.Date(df1[i,1])==as.Date(df2_mx[,1])),
oh_df_mx[which(as.Date(df1[i,1])==as.Date(df2_mx
[,1])),n+1]<-which.max(df1[(i-2):i,3]),invisible())
}
带有 fuzzyjoin
软件包的选项。
library(dplyr)
df1 %>%
mutate(ts = as.Date(ts)) %>%
fuzzyjoin::fuzzy_right_join(df2_mx %>%
mutate(ts = as.Date(ts), ts_2_day = ts - 2),
by = c('ts', 'ts' = 'ts_2_day'),
match_fun = c(`<=`, `>=`)) %>%
group_by(ts = ts.y) %>%
summarise(aa_h = max(aa_h, na.rm = TRUE))
# ts aa_h
# <date> <dbl>
#1 2020-01-17 3
#2 2021-01-16 6
#3 2021-01-26 9
我有两个数据框
df1= data.frame( ts = c('2020-01-15', '2020-01-16' , '2020-01-17', '2021-01-14', '2021-01-15','2021-
01-16','2021-01-24','2021-01-25','2021-01-26'),
aa_h=c(1,2,3,6,4,5,7,9,8),
bh= c(12,13,14,11,11,11,122,12,56))
df2_mx=data.frame( ts = c('2020-01-17', '2021-01-16' , '2021-01-26'),
aa= NA)
现在我想比较df1中df2_mx的日期,如果匹配,我想要最后一个aa_h的最大值两个和当天并将其插入 df2_mx
的“aa”列例子
第 1 行,即 df2_mx 的“2020-01-17”将匹配 df1 的第 3 行,它将在 2 天以上查找并获得值 which_max(c(1, 2,3))--> 3 并将其插入 df2_mx .
的“aa”列预期输出:
df2_mx=data.frame( ts = c('2020-01-17', '2021-01-16' , '2021-01-26'),
aa= c(3,6,9))
试用码 n=1
for (i in 1:nrow(df1)){
ifelse(which(as.Date(df1[i,1])==as.Date(df2_mx[,1])),
oh_df_mx[which(as.Date(df1[i,1])==as.Date(df2_mx
[,1])),n+1]<-which.max(df1[(i-2):i,3]),invisible())
}
带有 fuzzyjoin
软件包的选项。
library(dplyr)
df1 %>%
mutate(ts = as.Date(ts)) %>%
fuzzyjoin::fuzzy_right_join(df2_mx %>%
mutate(ts = as.Date(ts), ts_2_day = ts - 2),
by = c('ts', 'ts' = 'ts_2_day'),
match_fun = c(`<=`, `>=`)) %>%
group_by(ts = ts.y) %>%
summarise(aa_h = max(aa_h, na.rm = TRUE))
# ts aa_h
# <date> <dbl>
#1 2020-01-17 3
#2 2021-01-16 6
#3 2021-01-26 9