繁体   English   中英

R dplyr逐行获取which.min的名称

[英]R dplyr get name of which.min rowwise

我只是使用data.table方法回答了这个问题 ,并且一直在努力提供等效的dplyr ,但是失败了。

有一个简单的数据框,其列中包含数值。 我想使用dplyr获取具有最小值的列的名称。

请注意,我知道解决此问题的其他方法:目前,我唯一的兴趣是dplyr方法

id <- c(1,2,3,4,5,6,7,8,9,10)
x1 <- c(2,4,5,3,6,4,3,6,7,7)
x2 <- c(0,1,2,6,7,6,0,8,2,2)
x3 <- c(5,3,4,5,8,3,4,2,5,6)

DF <- data.frame(id, x1,x2,x3)

我尝试了以下几种变体:

DF %>% select(2:4) %>% rowwise() %>% mutate(y = function(x) names(x)[which.min(x)])

DF %>% select(2:4) %>% rowwise() %>% mutate(y = apply(x1:x3, 1, which.min(x1:x3))

但是还没有找到一种方法来执行dplyr 我将不胜感激!

预期产量:

DF
##     id x1 x2 x3  y
##  1:  1  2  0  5 x2
##  2:  2  4  1  3 x2
##  3:  3  5  2  4 x2
##  4:  4  3  6  5 x1
##  5:  5  6  7  8 x1
##  6:  6  4  6  3 x3
##  7:  7  3  0  4 x2
##  8:  8  6  8  2 x3
##  9:  9  7  2  5 x2
## 10: 10  7  2  6 x2

这是另一种方法。我没有运行任何基准测试,但我猜想它会比使用applyrowwise更好。

DF %>% 
  mutate(y = names(.)[max.col(.[2:4]*-1)+1L])
#    id x1 x2 x3  y
# 1   1  2  0  5 x2
# 2   2  4  1  3 x2
# 3   3  5  2  4 x2
# 4   4  3  6  5 x1
# 5   5  6  7  8 x1
# 6   6  4  6  3 x3
# 7   7  3  0  4 x2
# 8   8  6  8  2 x3
# 9   9  7  2  5 x2
# 10 10  7  2  6 x2

*-1是因为我们想要min而不是max列,而+1是因为我们仅查看2:4列,但需要正确的列名称作为回报。

这似乎有点(嗯,实际上非常)笨拙,但是...

DF %>% 
  mutate(y = apply(.[,2:4], 1, function(x) names(x)[which.min(x)]))
  id x1 x2 x3 y 1 1 2 0 5 x2 2 2 4 1 3 x2 3 3 5 2 4 x2 4 4 3 6 5 x1 5 5 6 7 8 x1 6 6 4 6 3 x3 7 7 3 0 4 x2 8 8 6 8 2 x3 9 9 7 2 5 x2 10 10 7 2 6 x2 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM