首页 文章

数据框和相关列名中行的最大值[重复]

提问于
浏览
1

这个问题在这里已有答案:

我有一个数据框(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 回答

  • 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

    类似但略有不同的方法 . 如果您的数据很大,这可能会更快一些 - 如果不是,我确信没有真正的差异会引起注意 .

    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
    

相关问题