在R中按SessionID分组聚合时保留关联的RobotID与AnimalID
解决R中分组统计并保留对应唯一标识的问题
你的核心需求是按SessionID分组计算Sensorvalue的统计量,同时保留每个SessionID对应的唯一AnimalID和RobotID,之前左连接出现重复行是因为原数据框中每个SessionID对应多行数据,直接连接会导致统计量被重复匹配。以下是几种可靠的解决方法:
方法一:分组时同时包含唯一标识列
由于你的数据中每个SessionID对应的AnimalID和RobotID是唯一的(同一SessionID下这两个值完全一致),可以直接将这三列作为分组依据,统计后自然保留对应标识:
Summary_df <- df %>% group_by(SessionID, AnimalID, RobotID) %>% summarise(Mean_Val = median(Sensorvalue), Max_Val = max(Sensorvalue), Min_Val = min(Sensorvalue), .groups = "drop")
.groups = "drop"用于取消分组状态,将结果转换为普通数据框,避免后续操作受分组影响。
方法二:在summarise中提取唯一标识值
如果不确定每个SessionID对应的标识是否绝对唯一,或者只想按SessionID分组,可以在统计时用first()或unique()提取组内的唯一标识值:
# 使用first()取组内第一个匹配值 Summary_df <- df %>% group_by(SessionID) %>% summarise(AnimalID = first(AnimalID), RobotID = first(RobotID), Mean_Val = median(Sensorvalue), Max_Val = max(Sensorvalue), Min_Val = min(Sensorvalue), .groups = "drop") # 或者使用unique()取组内唯一值(效果一致,因为组内值相同) Summary_df <- df %>% group_by(SessionID) %>% summarise(AnimalID = unique(AnimalID), RobotID = unique(RobotID), Mean_Val = median(Sensorvalue), Max_Val = max(Sensorvalue), Min_Val = min(Sensorvalue), .groups = "drop")
方法三:先创建标识映射表再连接
先提取SessionID与AnimalID、RobotID的唯一映射关系,再和统计结果连接,彻底避免重复:
# 生成唯一映射表 id_map <- df %>% select(SessionID, AnimalID, RobotID) %>% distinct() # 计算统计量并连接映射表 Summary_df <- df %>% group_by(SessionID) %>% summarise(Mean_Val = median(Sensorvalue), Max_Val = max(Sensorvalue), Min_Val = min(Sensorvalue), .groups = "drop") %>% left_join(id_map, by = "SessionID")
内容的提问来源于stack exchange,提问作者Niro Mal
相关产品推荐
相关产品推荐

