【问题标题】:R - find first, second and third largest values by rowR - 按行查找第一个、第二个和第三个最大值
【发布时间】:2019-07-25 10:53:37
【问题描述】:

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

df <- data.frame(v1 = c(0,1,2,3,4,5,6,7,8), v2 = c(5,6,3,21,24,7,8,9,6), v3 = c(23,5,24,87,6,32,5,48,6),v4 = c(2,32,6,58,5,21,4,5,87), v5 = c(5,23,65,86,4,12,115,5,24))

我需要创建三个新列,每行包含第一个、第二个和第三个最大值。所以想要的输出是这样的:

  v1 v2 v3 v4  v5 first second third
1  0  5 23  2   4  23     5      4
2  1  6  5 32  23  32     23     6
3  2  3 24  6  65  65     24     6
4  3 21 87 58  87  87     86     58
5  4 24  6  5   4  24     6      5
6  5  7 32 21  12  32     21     12
7  6  8  5  4 115  115    8      6
8  7  9 48  5   5  48     9      5
9  8  6  6 87  24  87     24     8

有什么简单的方法吗? 我可以用which.max得到最大值,它只是找到了让我困惑的第二个和第三个最大值

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以使用

    # add the columns
    df <- cbind.data.frame(df, t(apply(df, 1, function(row_i){
                                 sort(row_i, decreasing = TRUE)[1:3]})))
    # name the columns
    names(df)[(ncol(df)-2):ncol(df)] <- c("first", "second", "third")
    
    # see results
    df
      v1 v2 v3 v4  v5 first second third
    1  0  5 23  2   4  23     5      4
    2  1  6  5 32  23  32     23     6
    3  2  3 24  6  65  65     24     6
    4  3 21 87 58  87  87     86     58
    5  4 24  6  5   4  24     6      5
    6  5  7 32 21  12  32     21     12
    7  6  8  5  4 115  115    8      6
    8  7  9 48  5   5  48     9      5
    9  8  6  6 87  24  87     24     8
    

    【讨论】:

      【解决方案2】:

      你可以像这样使用apply

      df$first <- apply(df, 1, max)
      df$second <- apply(df, 1, function(x) -sort(-x[1:5])[2])
      df$third <- apply(df, 1, function(x) -sort(-x[1:5])[3])
      
      v1 v2 v3 v4  v5     first second third
      1  0  5 23  2   5    23      5     5
      2  1  6  5 32  23    32     23     6
      3  2  3 24  6  65    65     24     6
      4  3 21 87 58  86    87     86    58
      5  4 24  6  5   4    24      6     5
      6  5  7 32 21  12    32     21    12
      7  6  8  5  4 115   115      8     6
      8  7  9 48  5   5    48      9     7
      9  8  6  6 87  24    87     24     8
      

      【讨论】:

        猜你喜欢
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        相关资源
        最近更新 更多