R语言中如何基于m列与date列的耦合关联生成对应date4列
实现方案
方案1:同步生成m4和date4(推荐)
直接复用你原有case_when的分支逻辑,在生成m4的同时定义date4的取值,从根源上保证耦合对应关系,不会出现匹配错误:
library(tidyverse) library(lubridate) df <- data.frame(ID = c('1','2','3'), diff2.1 = c(28, 91, 90), diff3.1 = c(140, 92, 91), date1 = ymd(c('2014-10-12', '2014-06-01', '2015-02-10')), date2 = as.Date(c('2015-10-17', '2014-06-06', '2015-04-20')), date3 = as.Date(c('', '2014-08-13', '2015-12-01')), m1 = c('4','4','10'), m2 = c('3', '0', ' 1'), m3 = c('10', '7', '5')) df_new <- df %>% mutate( m4 = case_when( diff3.1 >= diff2.1 & diff3.1 < 91 ~ pmax(m1,m2,m3), diff3.1 > diff2.1 & diff3.1 > 90 & diff2.1 > 90 ~ m1, diff3.1 > diff2.1 & diff3.1 > 90 & diff2.1 < 91 ~ pmax(m1,m2) ), date4 = case_when( diff3.1 >= diff2.1 & diff3.1 < 91 ~ case_when( pmax(m1,m2,m3) == m1 ~ date1, pmax(m1,m2,m3) == m2 ~ date2, pmax(m1,m2,m3) == m3 ~ date3 ), diff3.1 > diff2.1 & diff3.1 > 90 & diff2.1 > 90 ~ date1, diff3.1 > diff2.1 & diff3.1 > 90 & diff2.1 < 91 ~ case_when( pmax(m1,m2) == m1 ~ date1, pmax(m1,m2) == m2 ~ date2 ) ) )
运行后得到的date4完全符合你给出的预期结果。
方案2:基于已有m4匹配date4
如果已经生成了m4,不想修改原有生成逻辑,可以用行向匹配实现:
df_new <- df %>% mutate( m4 = case_when( diff3.1 >= diff2.1 & diff3.1 < 91 ~ pmax(m1,m2,m3), diff3.1 > diff2.1 & diff3.1 > 90 & diff2.1 > 90 ~ m1, diff3.1 > diff2.1 & diff3.1 > 90 & diff2.1 < 91 ~ pmax(m1,m2) ) ) %>% rowwise() %>% mutate( date4 = c_across(date1:date3)[which(c_across(m1:m3) == m4)[1]] ) %>% ungroup()
注意事项
如果存在同一行多个m列的值和m4相等的情况,方案2会取第一个匹配到的日期,这种场景优先使用方案1保证逻辑准确性。
内容的提问来源于stack exchange,提问作者Youknowme
相关产品推荐
相关产品推荐

