在R中按分组计算多列中出现频率最高的因子水平
解决方案
可以通过分组后转长格式的思路实现需求,替代直接用across的方式,具体代码如下:
首先加载所需工具包:
library(dplyr) library(tidyr)
然后处理目标数据:
df %>% group_by(temperature) %>% # 将非分组列转成长格式,同时过滤NA值 pivot_longer(cols = -temperature, values_drop_na = TRUE) %>% # 统计分组内各值的出现次数 count(value, name = "occurrences") %>% # 提取分组内出现次数最多的记录 slice_max(n = 1, order_by = occurrences) %>% # 调整列名与顺序 rename(most_common = value) %>% select(temperature, most_common, occurrences)
运行后会输出你期望的结果:
| temperature | most_common | occurrences |
|---|---|---|
| 1 | apple | 3 |
| 2 | dodo | 4 |
| 3 | banana | 2 |
代码说明
group_by(temperature):按温度分组处理数据pivot_longer(...):把每组的var1/var2/var3列合并为单列,同时自动过滤NA值,避免统计无效数据count(value, name = "occurrences"):统计每个值在当前分组内的出现频次,并重命名频次列为occurrencesslice_max(...):提取分组内频次最高的行,若存在多个值频次相同,会保留所有对应行(示例数据无此情况)- 最后通过重命名和列顺序调整,得到目标输出格式
如果坚持用across思路,也可以先在分组内统计各列的频率,再合并后筛选最大值,但转长格式的方式更简洁直观,也更容易维护。
内容的提问来源于stack exchange,提问作者B209978
相关产品推荐
相关产品推荐

