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
相关产品推荐
相关产品推荐

