dplyr使用mutate计算行为占比时结果错误且时间列顺序混乱求助
问题原因
- 百分比计算错误:你在计算占比前的分组逻辑有误。第二次
group_by同时指定了Time、PredictedBehaviorFull、Context三个字段,导致每一行单独成为一个分组,sum(n)的结果等同于当前行的n值,最终percentage恒为1,不符合「按时间维度计算各行为占比」的需求。 - Time列顺序错乱:你的Time列是
d h格式的字符串,字符串默认按字符逐位比较排序,会出现0d 10h排在0d 2h前面的错误结果,需要转换为按时间逻辑排序的有序因子。
修正后代码
library(dplyr) library(stringr) # 1. 统计各分组计数 S06Behav <- S06 %>% group_by(Time, PredictedBehaviorFull, Context) %>% summarise(count = n(), .groups = "drop") # 2. 计算占比 + 修正Time列顺序 S06Proportions <- S06Behav %>% # 提取总小时数用于排序 mutate( day = as.integer(str_extract(Time, "\\d+(?=d)")), hour = as.integer(str_extract(Time, "\\d+(?=h)")), total_hour = day * 24 + hour ) %>% # 仅按Time分组,sum(count)即为当前时间下的总计数 group_by(Time) %>% mutate( percentage = count / sum(count), # 如需百分比格式可乘以100 # 把Time转成按总小时数排序的有序因子 Time = reorder(Time, total_hour) ) %>% # 去除辅助列、按时间排序 select(-day, -hour, -total_hour) %>% arrange(Time)
如果你需要的是每个Time+Context组合下的行为占比,只需要把上面的group_by(Time)改成group_by(Time, Context)即可。
内容的提问来源于stack exchange,提问作者Sharklady
相关产品推荐
相关产品推荐

