如何获取R数据框每行最频繁值首次出现的列名?
解决R数据框每行最频繁值首次出现列名的问题
你原代码的问题主要有两个:
- 没有排除
Participant列,导致计算频率时把字符型的参与者名称也纳入统计,结果偏离预期; - 返回的是频率最高的值本身,而非该值首次出现的列名,不符合需求。
解决方案代码
我们需要先过滤非数值列,再针对每行数值找到频率最高的值,最后定位该值首次出现的列名:
# 定义处理单行数据的自定义函数 get_first_max_col <- function(row) { # 提取当前行的数值部分(排除第一列Participant) num_vals <- row[-1] # 统计每个数值的出现频率 freq_table <- table(num_vals) # 找到频率最高的数值(若多个值频率相同,取table中最先出现的项) max_freq_val <- as.numeric(names(which.max(freq_table))) # 定位该数值首次出现的索引 first_index <- which(num_vals == max_freq_val)[1] # 返回对应的列名 names(row)[-1][first_index] } # 将函数应用到数据框的每一行 result <- apply(test_data, 1, get_first_max_col) print(result)
运行后输出的结果完全符合你的预期:
Lion Cat Dog Snake Tiger Mouse "week_4" "week_0" "week_1" "week_0" "week_2" "week_3"
关键细节说明
row[-1]:排除第一列的参与者名称,只处理数值型的周数据;- 转换
max_freq_val为数值型:因为table返回的名称是字符格式,需要和原数值列匹配才能找到位置; which(...)取第一个索引:确保拿到的是目标值首次出现的列位置。
内容的提问来源于stack exchange,提问作者VR28
相关产品推荐
相关产品推荐

