如何在R语言DataFrame中按Country分组生成RESULT计算列?
解决R语言按分组计算并添加新列的问题
我明白你的困扰啦——用group_by()加summarize()没成功,是因为summarize()会把数据聚合到分组维度,而我们需要保留原数据的每一行来生成新列,这时候mutate()才是正确的选择!
方法一:使用dplyr包(推荐,代码可读性高)
首先确保你已经安装并加载了dplyr包,然后按以下步骤操作:
# 加载dplyr包 library(dplyr) # 构造你的原始数据框 COUNTRY<- c('USA','USA','USA','USA','USA','USA','USA','USA','USA','UK','UK','UK','UK','GERMANY','GERMANY','GERMANY','GERMANY','GERMANY','GERMANY') CITY<- c('NEW YORK','LOS ANGELES','CHICAGO','HOUSTON','PHOENIX','PHILADELPHIA','SAN ANTONIO','SAN DIEGO','DALLAS','LONDON','CAMBRIDGE','LIVERPOOL','MANCHESTER','BERLIN','HAMBURG','FRANKFURT','COLOGNE','STUTTGART','HANNOVER') BMW_CAR<- c(25,46,176,22,22,25,881,133,339,177,29,175,165,165,617,350,232,14,778) DF <- data.frame(COUNTRY,CITY,BMW_CAR) # 按国家分组,添加RESULT列 DF <- DF %>% group_by(COUNTRY) %>% mutate(RESULT = sum(BMW_CAR) - BMW_CAR) %>% ungroup() # 取消分组,方便后续非分组操作,可选
代码解释:
group_by(COUNTRY):将数据按COUNTRY列分组mutate(RESULT = sum(BMW_CAR) - BMW_CAR):在原数据的每一行添加RESULT列,值为当前组的BMW_CAR总和减去当前行的BMW_CAR值ungroup():可选操作,如果你后续不需要保留分组状态,可以取消分组
方法二:使用Base R(无需额外包)
如果你不想加载dplyr包,用Base R的ave()函数也能快速实现:
# 构造原始数据框(同上) COUNTRY<- c('USA','USA','USA','USA','USA','USA','USA','USA','USA','UK','UK','UK','UK','GERMANY','GERMANY','GERMANY','GERMANY','GERMANY','GERMANY') CITY<- c('NEW YORK','LOS ANGELES','CHICAGO','HOUSTON','PHOENIX','PHILADELPHIA','SAN ANTONIO','SAN DIEGO','DALLAS','LONDON','CAMBRIDGE','LIVERPOOL','MANCHESTER','BERLIN','HAMBURG','FRANKFURT','COLOGNE','STUTTGART','HANNOVER') BMW_CAR<- c(25,46,176,22,22,25,881,133,339,177,29,175,165,165,617,350,232,14,778) DF <- data.frame(COUNTRY,CITY,BMW_CAR) # 添加RESULT列 DF$RESULT <- ave(DF$BMW_CAR, DF$COUNTRY, FUN = function(x) sum(x) - x)
代码解释:
ave()函数会根据第二个参数(DF$COUNTRY)分组,对第一个参数(DF$BMW_CAR)应用自定义函数,返回和原向量长度一致的结果,正好可以直接赋值给新列。
验证结果
两种方法得到的结果都完全符合你的要求:
- USA组BMW_CAR总和为1669,第一行RESULT=1669-25=1644
- UK组总和为546,第十行RESULT=546-177=369
- GERMANY组总和为2156,第18行RESULT=2156-14=2142
内容的提问来源于stack exchange,提问作者Bruno Avila
相关产品推荐
相关产品推荐

