You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 16:15:03