基于R语言Base包实现按x首次出现计算y求和的result向量
用Base R生成符合指定规则的result向量
给定已按x列排序的数据集:
df <- data.frame(x = c(1,2,3,4,5,6,6,8,9,10,10,11,11,11,12,13,13,14), y = c(1,2,3,4,5,6,7,8,9,1,2,4,5,3,5,6,7,8), result = c(1,2,3,4,5,13,0,8,9,1,0,4,0,0,5,13,0,8))
需要生成result向量,规则等价于Excel公式IF(COUNTIFS($A$2:A2,A2)>1,0,SUMIFS(B:B,A:A,A2)):
- 若当前行的
x值为首次出现,计算所有相同x值对应的y列之和 - 否则赋值为0
- 要求使用Base R编写,适配大型数据集,无需额外排序
方案一:结合tapply与duplicated
# 计算每个x对应的y总和 x_group_sums <- tapply(df$y, df$x, sum) # 生成result:首次出现的x取对应总和,重复行赋值0 df$result <- ifelse(!duplicated(df$x), x_group_sums[as.character(df$x)], 0)
tapply是Base R中高效的分组聚合函数,适合处理大型数据集的分组求和duplicated快速标记重复行,配合ifelse完成赋值逻辑
方案二:使用ave函数(更简洁)
df$result <- ave(df$y, df$x, FUN = function(group) { ifelse(seq_along(group) == 1, sum(group), 0) })
ave按x分组处理y值,每个分组内仅第一行(因数据集已按x排序,即首次出现的行)返回分组总和,其余行返回0- 全程向量化操作,无循环,效率适配大型数据集
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

