【问题标题】:Adding a new variable that indicates which existing variable has the maximum value for each row [duplicate]添加一个新变量,指示哪个现有变量在每行中具有最大值[重复]
【发布时间】:2017-08-09 19:39:34
【问题描述】:

我有以下数据框:

mydf <- data.frame(label = c("A", "B", "C"),
Var1 = c(0.07635660, 0.22186266, -0.13299621),
Var2 = c(0.25517996, 0.65896751, 0.32703359),
Var3 = c(0.63174426, 0.21518955, 0.47102852))

对于每一行,我想添加一个新变量,该变量将返回它具有最大值的变量的名称:

mydf_end_goal <- data.frame(label = c("A", "B", "C"),
Var1 = c(0.07635660, 0.22186266, -0.13299621),
Var2 = c(0.25517996, 0.65896751, 0.32703359),
Var3 = c(0.63174426, 0.21518955, 0.47102852),
Max = c("Var3", "Var2", "Var3"))

最有效的方法是什么,最好使用dplyrpurrr?现在,我能想到的最好的就是一系列ifelse 条件,这真的很烦人,因为我的变量比我上面的玩具示例中的要多:

mydf %>% 
 rowwise() %>% 
 mutate(Max = ifelse(Var1 > Var2 & Var1 > Var3, "Var1", 
                     ifelse(Var2 > Var1 & Var2 > Var3, "Var2", "Var3")))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这不一定是最有效的方法,但使用dplyrpurrr 是一种方法:

    mydf <- mydf %>%
      mutate(Max = select_(., ~-label) %>%
        pmap_chr(function(...)
          names(which.max(c(...))[1])
      ))
    

    或者使用max.col:

    mydf <- mydf %>%
      mutate(Max = select_(., ~-label) %>%
        {names(.)[max.col(.)]}
      )
    

    【讨论】:

      【解决方案2】:

      不需要循环。你可以简单地使用max.col

      mydf$max1 <- names(mydf)[max.col(mydf[-1])+1]
      
      mydf
      #  label       Var1      Var2      Var3 max1
      #1     A  0.0763566 0.2551800 0.6317443 Var3
      #2     B  0.2218627 0.6589675 0.2151896 Var2
      #3     C -0.1329962 0.3270336 0.4710285 Var3
      

      【讨论】:

      • 我不知道max.col() - 非常简洁的答案。
      【解决方案3】:

      你可以不用任何包:

      mydf$MaxVar <- colnames(mydf)[apply(mydf[-1], 1, which.max) +1]
      
      mydf
      #  label       Var1      Var2      Var3 MaxVar
      #1     A  0.0763566 0.2551800 0.6317443   Var3
      #2     B  0.2218627 0.6589675 0.2151896   Var2
      #3     C -0.1329962 0.3270336 0.4710285   Var3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-31
        • 2019-05-13
        • 1970-01-01
        • 2021-07-08
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        相关资源
        最近更新 更多