我有以下数据框:
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"))
最有效的方式是什么,最好使用dplyr
或purrr
?现在,我能想出的最好的是一系列ifelse
条件,因为我有比上面的玩具示例更多的变量,所以非常烦人:
mydf %>%
rowwise() %>%
mutate(Max = ifelse(Var1 > Var2 & Var1 > Var3, "Var1",
ifelse(Var2 > Var1 & Var2 > Var3, "Var2", "Var3")))
答案 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)
这不一定是最有效的方法,但使用dplyr
和purrr
是一种方法:
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(.)]}
)