首页 > 解决方案 > 查找一行中所有并列的最大值,如果列包含最大值,则返回 true 或 false

问题描述

我有一些包含数字列的数据:

df <- data.frame(v1 = c(0,1,2,3,4,5,6,7,8,9),
                 v2 = c(2,1,4,7,6,7,8,9,0,1),
                 v3 = c(4,1,6,7,8,9,0,1,2,3),
                 v4 = c(0,1,2,7,4,5,6,7,8,9),
                 v5 = c(0,1,6,3,6,9,8,9,0,1))

我可以找到第一个最大值并使用 which.max 返回其列名:

df$max <- colnames(df)[apply(df,1,which.max)]

相反,我想添加五个新列,如果相应的列是最大值或与最大值绑定,则插入 TRUE,否则插入 FALSE:

   v1 v2 v3 v4 v5 v1max v2max v3max v4max v5max
1   0  2  4  0  0 FALSE FALSE TRUE  FALSE FALSE
2   1  1  1  1  1 TRUE  TRUE  TRUE  TRUE  TRUE  
3   2  4  6  2  6 FALSE FALSE TRUE  FALSE TRUE     
4   3  7  7  7  3 FALSE TRUE  TRUE  TRUE  FALSE
5   4  6  8  4  6 FALSE FALSE TRUE  FALSE FALSE
6   5  7  9  5  9 FALSE FALSE TRUE  FALSE TRUE
7   6  8  0  6  8 FALSE TRUE  FALSE FALSE TRUE
8   7  9  1  7  9 FALSE TRUE  FALSE FALSE TRUE
9   8  0  2  8  0 TRUE  FALSE FALSE TRUE  FALSE
10  9  1  3  9  1 TRUE  FALSE FALSE TRUE  FALSE

有没有一种简单的方法可以实现这一目标?

标签: r

解决方案


一个简单而有效的解决方案是使用数据框获得逐行最大值do.callpmax并将其与数据框进行比较以获得可以分配为新列的逻辑向量。

df[paste0(names(df), "max")] <- df == do.call(pmax, df)

df
#   v1 v2 v3 v4 v5 v1max v2max v3max v4max v5max
#1   0  2  4  0  0 FALSE FALSE  TRUE FALSE FALSE
#2   1  1  1  1  1  TRUE  TRUE  TRUE  TRUE  TRUE
#3   2  4  6  2  6 FALSE FALSE  TRUE FALSE  TRUE
#4   3  7  7  7  3 FALSE  TRUE  TRUE  TRUE FALSE
#5   4  6  8  4  6 FALSE FALSE  TRUE FALSE FALSE
#6   5  7  9  5  9 FALSE FALSE  TRUE FALSE  TRUE
#7   6  8  0  6  8 FALSE  TRUE FALSE FALSE  TRUE
#8   7  9  1  7  9 FALSE  TRUE FALSE FALSE  TRUE
#9   8  0  2  8  0  TRUE FALSE FALSE  TRUE FALSE
#10  9  1  3  9  1  TRUE FALSE FALSE  TRUE FALSE

一个解决方案apply可能是

df[paste0(names(df), "max")] <- t(apply(df, 1, function(x) x == max(x)))

推荐阅读