R语言:按组计算均值并仅替换指定分组的speed列值
解决方法
你的问题出在两个核心点上:
if语句的局限性:if仅接受单个逻辑值作为判断条件,但df$dive %in% c("dive3", "dive4")返回的是长度为14的逻辑向量,R只会取第一个元素执行判断,这就是警告信息的由来。summarise的作用逻辑:summarise会将每个分组聚合为一行,最终得到的是4行的汇总结果,而非你需要的保留原14行结构的数据集。
下面提供两种可行的实现方式:
方法一:使用dplyr包(tidyverse风格)
通过group_by分组后,用mutate(而非summarise)修改列值,mutate会完整保留原数据的行数结构:
library(dplyr) df2 <- df %>% group_by(dive) %>% mutate(speed = ifelse(dive %in% c("dive1", "dive2"), mean(speed), speed)) %>% ungroup()
执行后df2会保持原14行结构:
- dive1和dive2组的每个
speed值都会替换为对应组的均值 - dive3和dive4组的
speed值完全保留原始数值
方法二:使用Base R(无需额外安装包)
用ave函数计算分组均值,结合ifelse完成批量替换:
df$speed <- with(df, ifelse(dive %in% c("dive1", "dive2"), ave(speed, dive), speed))
这个方法直接在原数据框上修改speed列,最终效果和方法一完全一致。
内容的提问来源于stack exchange,提问作者Matteo Bulgarelli
相关产品推荐
相关产品推荐

