2017-03-18 49 views
0

最大值,我有以下的数据帧:添加一个新的变量,表示其存在的变量有每行

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

回答

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 
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 
+1

我不知道'max.col()' - 非常简洁的答案。 – Phil

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(.)]} 
) 
相关问题