【问题标题】:the column name of the largest number in each row of a data.frame [duplicate]data.frame 每一行中最大数字的列名 [重复]
【发布时间】:2021-03-07 08:36:01
【问题描述】:

我想获取每行的最大数量的列名。 例如, 一张桌子可以是

x = c(1,2,4,4,3 ) 
y = c(2,3,3,5,4 ) 
z = c(4,5,2,1,1 ) 
df<-data.frame(x,y,z)
df

我想要得到的结果是

  x y z cloumn_name
1 1 2 4 z
2 2 3 5 z
3 4 3 2 x
4 4 5 1 y
5 3 4 1 y

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个矢量化的解决方案:

    library(dplyr)
    df %>% mutate(column_name = names(df)[apply(df,1,which.max)])
    

    【讨论】:

      【解决方案2】:

      这也可以达到reshaping data,但是可能有点长:

      library(dplyr)
      library(tidyr)
      #Code
      df <- df %>% mutate(id=row_number()) %>%
        left_join(
          df %>% mutate(id=row_number()) %>%
            pivot_longer(-id) %>%
            group_by(id) %>%
            mutate(Var=ifelse(value==max(value),name,NA)) %>%
            select(c(id,Var)) %>%
            filter(!is.na(Var)) %>%
            filter(!duplicated(Var)) 
        ) %>% select(-id)
      

      输出:

        x y z Var
      1 1 2 4   z
      2 2 3 5   z
      3 4 3 2   x
      4 4 5 1   y
      5 3 4 1   y
      

      【讨论】:

        【解决方案3】:

        这行得通吗:

        library(dplyr)
        df %>% rowwise() %>% mutate(column_name = names(df)[which.max(c_across())])
        # A tibble: 5 x 4
        # Rowwise: 
              x     y     z column_name
          <dbl> <dbl> <dbl> <chr>      
        1     1     2     4 z          
        2     2     3     5 z          
        3     4     3     2 x          
        4     4     5     1 y          
        5     3     4     1 y      
        

        【讨论】:

          【解决方案4】:

          base R 和apply试试这个

          df$maxcol <- apply(df, 1, function(x) colnames(df)[which.max(x)])
          > df$maxcol
          [1] "z" "z" "x" "y" "y"
          

          这是一个非常简单的解决方案,您可以看到applymargin 参数设置为1,这意味着该函数将应用于df 的所有行。

          【讨论】:

            猜你喜欢
            • 2011-02-23
            • 1970-01-01
            • 2020-12-16
            • 2012-05-07
            • 2020-04-16
            • 2021-10-13
            • 1970-01-01
            • 1970-01-01
            • 2013-07-13
            相关资源
            最近更新 更多