首页 > 解决方案 > 在 R 中跨三列查找最大值

问题描述

我想在三列中的每一行中找到最大值,并让新列打印最高值列的名称。

示例表如下所示:

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)

我想创建这个:

ID X 是的 z 最大限度
1 1 2 4 z
2 2 3 4 z
3 5 3 2 X
4 4 1 1 X
5 5 1 1 X

我试过了:

df%>% rowwise() %>% mutate(max = max(x, y, z))

并收到输出:

ID X 是的 z 最大限度
1 1 2 4 4
2 2 3 4 4
3 5 3 2 5
4 4 1 1 4
5 5 1 1 5

有人知道我如何更正此代码以产生预期的结果吗?

标签: rdplyrmax

解决方案


使用pmax而不是max因为它矢量化并且不需要经过rowwise(这应该很慢)

library(dplyr)
df %>% 
    mutate(Max = pmax(x, y, z))

在 OP 的函数 with 中rowwise,如果我们需要列名,使用which.max获取列索引

df %>%
  rowwise %>%
  mutate(Max = names(.)[which.max(c(x, y, z))]) %>%
  ungroup

-输出

# A tibble: 5 × 4
      x     y     z Max  
  <dbl> <dbl> <dbl> <chr>
1     1     2     4 z    
2     2     3     4 z    
3     5     3     2 x    
4     4     1     1 x    
5     5     1     1 x    

或者使用vectorizeidmax.col查找具有最大值的每一行的列索引并获取names与该索引对应的

df %>% 
    mutate(Max = names(.)[max.col(., 'first')])

-输出

  x y z Max
1 1 2 4   z
2 2 3 4   z
3 5 3 2   x
4 4 1 1   x
5 5 1 1   x

推荐阅读