添加一个新变量,指示哪个现有变量具有每行的最大值

时间:2017-03-18 06:20:03

标签: r dplyr

我有以下数据框:

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")))

3 个答案:

答案 0 :(得分:4)

你可以不用任何包裹:

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

答案 1 :(得分:4)

不需要循环。您只需使用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

答案 2 :(得分: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(.)]}
  )