如何修改代码用aggregate sum生成与DataFrame尺寸匹配的新变量?
解决方法
你的错误原因是aggregate()返回的是仅包含4个cluster对应总和的小数据集,而mutate()需要为原数据的8行每一行生成对应值,两者尺寸不匹配导致报错。下面两种方法都能解决问题:
方法一:使用dplyr分组求和(推荐)
直接通过group_by()按cluster分组后,用sum(weight)计算每组总和,mutate()会自动将这个值填充到组内的每一行:
data.test <- data.frame(cluster = c(1, 1, 2, 2, 3, 3, 4, 4), weight = c(240, 240, 300, 300, 500, 500, 250, 250)) data.test <- data.test %>% group_by(cluster) %>% mutate(weight_total = sum(weight)) %>% ungroup() # 可选,取消数据的分组状态,方便后续操作
方法二:结合aggregate与left_join
先通过aggregate()计算每组总和,再用left_join()将总和匹配回原数据的对应行:
data.test <- data.frame(cluster = c(1, 1, 2, 2, 3, 3, 4, 4), weight = c(240, 240, 300, 300, 500, 500, 250, 250)) # 先计算每个cluster的总和并改名 cluster_sum <- aggregate(weight ~ cluster, data.test, sum) %>% rename(weight_total = weight) # 合并到原数据 data.test <- data.test %>% left_join(cluster_sum, by = "cluster")
两种方法最终都会生成包含8行的weight_total变量,每个cluster下的两行都会对应该组的weight总和。
内容的提问来源于stack exchange,提问作者four77
相关产品推荐
相关产品推荐

