【问题标题】:R dplyr get name of which.min rowwiseR dplyr 逐行获取 which.min 的名称
【发布时间】:2016-09-08 20:59:23
【问题描述】:

我刚刚用data.table 方法回答了this question,并且正在努力提供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-way。我会很感激任何提示!

预期输出:

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

【问题讨论】:

  • 我不知道是不是 dplyr 方式,但像 DF %&gt;% rowwise %&gt;% mutate(y = names(.)[2:4][which.min(c(x1, x2, x3))]) 这样的方式似乎可以工作。

标签: r dplyr min


【解决方案1】:

这是另一种方法。我没有运行任何基准测试,但我的猜测是它的性能会比使用 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 但需要正确的列名作为回报。

【讨论】:

  • 我刚刚在 100 万行数据帧上对您和我的数据进行了计时,您的代码运行时间约为 1/12(中位数为 0.33 秒与 4.0 秒)。绝对是一种更快的方法。
【解决方案2】:

这看起来有点(嗯,实际上非常)笨重但是......

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

【讨论】:

  • system.time for @eipi10 的答案是 1e6 行数据帧的大约 17.5 秒,而@aosmith 在 cmets 中提供的答案大约需要 94.1 秒。感谢两位!
  • 我尽量远离rowwise,因为它总体上看起来很慢。
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 2022-01-13
  • 2018-05-15
  • 2019-01-31
  • 2016-07-31
  • 2015-10-19
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多