r - 在 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 |
有人知道我如何更正此代码以产生预期的结果吗?
解决方案
使用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