R语言实现含重复TrackerID的双数据集加权合并问询
问题:合并数据集并计算Signatory加权平均值
我有两个来自Global Energy Monitor的数据集,需要合并。两者都包含电厂的TrackerID字段:
- Dataset1包含完整的TrackerID序列(1、2、3……i)
- Dataset2中部分TrackerID缺失,部分重复出现,同一TrackerID可能对应
Signatory变量的不同取值
需求:在Dataset1中新增加权Signatory变量,规则如下:
- 若TrackerID未在Dataset2中出现,设为NA
- 若存在,计算该ID对应的Signatory值的加权平均值(此处默认每条记录权重相同,即算术平均)
我尝试的代码(未成功)
allIDs <- as.list(Dataset1$TrackerID) k = 1 for(i in allIDs){ Dataset1$weightedsignatory[k] <- i k <- k + 1 }
示例数据集
# 完整ID的Dataset1 Dataset1 <- data.frame(TrackerID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Name = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j")) # 含重复ID的Dataset2 Dataset2 <- data.frame(TrackerID = c(1, 3, 3, 6, 7, 7, 7, 10), Signatory= c(1, 1, 0, 0, 1, 0, 1, 1))
期望生成的数据集
Dataset.wished <- data.frame(TrackerID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Name = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"), w.Signatory = c(1, NA, 0.5, NA, NA, 0, 0.66, NA, NA, 1))
解决方案
方法1:基础R实现
先分组计算平均值,再合并到Dataset1:
# 计算每个TrackerID的Signatory平均值 signatory_avg <- aggregate(Signatory ~ TrackerID, data = Dataset2, FUN = mean) colnames(signatory_avg)[2] <- "w.Signatory" # 合并到Dataset1,未匹配的自动设为NA Dataset1 <- merge(Dataset1, signatory_avg, by = "TrackerID", all.x = TRUE)
方法2:dplyr包实现(更简洁)
如果习惯使用tidyverse工具链,代码更直观:
library(dplyr) Dataset1 <- Dataset1 %>% left_join( Dataset2 %>% group_by(TrackerID) %>% summarise(w.Signatory = round(mean(Signatory), 2), .groups = "drop"), by = "TrackerID" )
注:示例中0.66是2/3的两位小数结果,上述代码用round()函数统一调整了小数位数,可根据需求修改保留位数。
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

