【发布时间】:2019-07-14 10:29:15
【问题描述】:
我正在尝试获取所选列中具有最高值的列的索引。尝试使用dplyr 时,我的尝试没有给我正确的结果。
library(dplyr);library(magrittr)
DF1 <- data.frame(Factor1 = c(1,2,4),Factor2 = c(3,1,1),Factor3 = c(9,1,0)) %>%
mutate(max_ind = which.max(c(.$Factor1,.$Factor2,.$Factor3))) %>% print
Factor1 Factor2 Factor3 max_ind
1 1 3 9 7
2 2 1 1 7
3 4 1 0 7
错在哪里?为什么dplyr 会这样。我可能应该使用rowwise,但这似乎不是best way。在base、tidyverse 或data.table 中是否想过如何做到这一点?
Edit-1(其他尝试)
有了 sapply,我得到了这个:
DF1 <- data.frame(Factor1 = c(1,2,4),Factor2 = c(3,1,1),Factor3 = c(9,1,0)) %>%
+ mutate(max_ind = which.max(c(Factor1,Factor2,Factor3)),
+ max_ind2 = sapply(X = ., function(x) which.max(c(x[Factor1],x[Factor2],x[Factor3])))) %>% print
Factor1 Factor2 Factor3 max_ind max_ind2
1 1 3 9 7 4
2 2 1 1 7 1
3 4 1 0 7 1
但在这里我看到第一行是 4,而应该是 3。
编辑-2
我也在寻找一种解决方案,我们可以指定用于比较的列 (which.max)
编辑-3
所有base、purrr::map 和dplyr::mutate 示例都有效。
#R>DF1 <- data.frame(Factor1 = c(1,2,4,1),Factor2 = c(3,1,1,6),Factor3 = c(9,1,0,4))
#R>DF1 %>% mutate(max_ind_purrr = pmap(.l = list(Factor1,Factor2,Factor3),~which.max(c(...)))) %>% print()
Factor1 Factor2 Factor3 max_ind_purrr
1 1 3 9 3
2 2 1 1 1
3 4 1 0 1
4 1 6 4 2
#R>DF1 %>% mutate(max_ind_dplyr=max.col(DF1[,1:3]))
Factor1 Factor2 Factor3 max_ind_dplyr
1 1 3 9 3
2 2 1 1 1
3 4 1 0 1
4 1 6 4 2
#R>DF1 <- transform(DF1,max_ind_base=apply(DF1[, c('Factor1','Factor2','Factor3')],1,which.max))%>% print
Factor1 Factor2 Factor3 max_ind_base
1 1 3 9 3
2 2 1 1 1
3 4 1 0 1
4 1 6 4 2
【问题讨论】:
-
DF1$max_ind <- max.col(DF1)? -
这不完整。我应该能够指定应该用于比较的列。
-
@DavidArenburg Neat,不知道这是矢量化的,我已将其包含在我的答案中。
-
@Stat-R 如果需要可以指定。
-
@jay.sf 没关系。
标签: r dplyr data.table