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

R语言:基于唯一ID与匹配日期的ACR列计算实现求助

解决按ID和日期匹配计算ACR的问题

问题分析

你的需求是针对每个唯一ID,在同一日期下同时有al和cr非缺失值的行计算ACR,但原代码存在几个关键问题:

  • if_else语法错误:括号位置混乱,且date==date是恒成立的条件,根本没起到筛选同日期有效数据的作用
  • 直接引用example$al会绕过分组逻辑,应该使用当前分组内的列值
  • 未考虑al和cr的缺失值,直接计算会导致无效的NA结果

正确解法

方法1:先聚合再合并(更清晰)

先把同一ID+日期下的al和cr合并到同一行,再计算ACR,适配你的多行列结构:

library(dplyr)

# 按id和日期分组,提取每组非缺失的al和cr
agg_data <- example %>%
  group_by(id, date) %>%
  summarise(
    al = first(na.omit(al)),  # 取该组第一个非缺失的al(若存在)
    cr = first(na.omit(cr)),  # 取该组第一个非缺失的cr(若存在)
    .groups = "drop"
  ) %>%
  # 仅当al和cr都非缺失时计算ACR
  mutate(ACR = if_else(!is.na(al) & !is.na(cr), 
                      (al * 100) / ((cr * 0.0113) * 0.01), 
                      NA_real_))

# 将计算结果合并回原数据框
example2 <- example %>%
  left_join(agg_data %>% select(id, date, ACR), by = c("id", "date"))

方法2:直接在原数据框分组计算

如果想直接在原数据上处理,可利用分组内的同日期值匹配:

example2 <- example %>%
  group_by(id, date) %>%
  mutate(
    # 提取分组内非缺失的al和cr值
    al_valid = first(na.omit(al)),
    cr_valid = first(na.omit(cr)),
    # 仅当两者都有效时计算ACR
    ACR = if_else(!is.na(al_valid) & !is.na(cr_valid),
                  (al_valid * 100) / ((cr_valid * 0.0113) * 0.01),
                  NA_real_)
  ) %>%
  # 移除中间辅助列
  select(-al_valid, -cr_valid) %>%
  ungroup()

结果说明

运行后example2中:

  • ID A01的2014-10-29行、ID A02的1993-10-22行会得到正确的ACR计算值
  • 其他无有效al/cr配对的行,ACR列会显示NA

内容的提问来源于stack exchange,提问作者Elizabethral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:10:27