数据框和相关列名中第n行的最大值

时间:2016-04-12 19:49:45

标签: r

我有一个数据框(df1)

DF1:

v1    v2    v3    v4
--    --    --    --
4.1   1.2   12    1.4
14    18.4  15.1  6.9

我想找到每一行的第n个最大值以及该值的列名。

敌人的例子,假设我想找到每一行的第二大值和相关的列名。所以输出(df2)应该是:

DF2:

value   col_name
---     --------
4.1     v1
15.1    v3

我怎么能用R做到这一点?我会很高兴得到任何帮助。非常感谢。

2 个答案:

答案 0 :(得分:2)

这很粗糙,但完成了工作:

second_largest <- apply(df, 1, FUN = function(x) tail(sort(x), 2)[1])
cols <- which(df == second_largest, arr.ind = T)[, 2]

df2 <- data.frame(value = second_largest,
                  col_name = colnames(df)[cols])

# df2
#   value col_name
# 1   4.1       v1
# 2  15.1       v3

dplyrtidyr替代方:

library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  gather(col, val, -row) %>%
  group_by(row) %>%
  arrange(val) %>%
  top_n(2) %>%
  do(head(., 1))

答案 1 :(得分:1)

类似但略有不同的方法。如果您的数据很大,这可能会更快一些 - 如果不是,我确定没有真正的差异会显而易见。

n = 2L
mat = as.matrix(df1)
ind = apply(df1, 1, FUN = function(x) which(rank(-x) == n))
data.frame(value = mat[cbind(1:nrow(mat), ind)], col_name = colnames(mat)[ind])
#   value col_name
# 1   4.1       v1
# 2  15.1       v3