R语言如何获取数据框每行三列最大值对应的列名
R 取每行最大值对应列名的实现方法
问题原因
原有代码调用max()仅返回最大值的数值,没有匹配对应列名的逻辑,因此无法得到预期结果。
解决方案
1. 基于tidyverse管道的修改方案
沿用原有的rowwise()逻辑,调整mutate内的取值逻辑即可:
library(dplyr) # 示例数据 x = c(1,2,5,4,5 ) y = c(2,3,3,1,1 ) z = c(4,4,2,1,1 ) df<-data.frame(x,y,z) # 实现代码 df <- df %>% rowwise() %>% mutate(max_col = names(.)[which.max(c_across(x:z))])
如果存在多列数值同为最大值的场景,需要返回所有符合条件的列名,可以调整为:
df <- df %>% rowwise() %>% mutate(max_col = paste0(names(.)[c_across(x:z) == max(c_across(x:z))], collapse = ","))
2. 更简洁的base R实现方案
如果不需要依赖tidyverse包,用apply按行处理执行效率更高:
df$max_col <- apply(df, 1, function(row) names(row)[which.max(row)])
输出效果
处理后的df结果如下:
| x | y | z | max_col |
|---|---|---|---|
| 1 | 2 | 4 | z |
| 2 | 3 | 4 | z |
| 5 | 3 | 2 | x |
| 4 | 1 | 1 | x |
| 5 | 1 | 1 | x |
内容的提问来源于stack exchange,提问作者user16004454
相关产品推荐
相关产品推荐

