【问题标题】:find list of higgest value in row and get colum name of them查找行中的最大值列表并获取它们的列名
【发布时间】:2021-10-28 06:49:40
【问题描述】:

我的意见:

df <- data.frame("foo"=1, "bar"=2, "baz"=3, "gaz"=12, "taz"=14, "paz"=4)

我想在它们所在的第一行和列名中获得 3 个最大值。所以我希望得到这样的东西taz,gaz,paz.
我尝试pmaxslice_max 没有成功

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    如果你的 data.frame 真的只有一行,你可以使用

    library(dplyr)
    library(tidyr)
    
    df %>% 
      pivot_longer(everything()) %>% 
      slice_max(value, n = 3)
    

    返回

    # A tibble: 3 x 2
      name  value
      <chr> <dbl>
    1 taz      14
    2 gaz      12
    3 paz       4
    

    否则,您要么必须进行一些过滤,要么将行号与一些分组结合使用。

    【讨论】:

      【解决方案2】:

      这里有一个带有apply 的选项,可以对df 中的每一行执行此操作。

      apply(df, 1, function(x) names(head(sort(x, decreasing = TRUE), 3)))
      
      #      [,1] 
      #[1,] "taz"
      #[2,] "gaz"
      #[3,] "paz"
      

      如果你需要值和列名,你可以返回一个列表。

      apply(df, 1, function(x) {
        x <- head(sort(x, decreasing = TRUE), 3)
        list(value = as.numeric(x), name = names(x))
      })
      
      #[[1]]
      #[[1]]$value
      #[1] 14 12  4
      
      #[[1]]$name
      #[1] "taz" "gaz" "paz"
      

      【讨论】:

        【解决方案3】:

        我们可以在base R 中使用stackorder

        out <- stack(df)[2:1]
        head(out[order(-out$values),], 3)
          ind values
        5 taz     14
        4 gaz     12
        6 paz      4
        

        【讨论】:

          【解决方案4】:

          我们可以试试这个

          > df[order(-unlist(df))[1:3]]
            taz gaz paz
          1  14  12   4
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-07
            相关资源
            最近更新 更多