我试图获取所选列中具有最高值的列的索引。尝试使用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
中做到这一点?
有了蓝宝石,我得到了:
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。
我还在寻找一种解决方案,我们可以指定用于比较的列(which.max
所有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
答案 0 :(得分:3)
在基数R中,您可以执行以下操作:
DF1 <- transform(DF1, max_ind=apply(DF1, 1, which.max))
但是,正如 @DavidArenburg 在评论中明智指出的那样-实际上存在矢量化方法max.col()
。
DF1 <- transform(DF1, max_ind=max.col(DF1))
# Factor1 Factor2 Factor3 max_ind
# Factor1 1 3 9 3
# Factor2 2 1 1 1
# Factor3 4 1 0 1
要获取指定列名的最大值,只需对子集进行相应的操作。
DF1 <- transform(DF1, max_ind_subset=max.col(DF1[c("Factor1", "Factor2")]))
# Factor1 Factor2 Factor3 max_ind_subset
# 1 1 3 9 2
# 2 2 1 1 1
# 3 4 1 0 1
DF1 <- structure(list(Factor1 = c(1, 2, 4), Factor2 = c(3, 1, 1), Factor3 = c(9,
1, 0)), class = "data.frame", row.names = c(NA, -3L))
答案 1 :(得分:3)
我认为您是在进行逐行比较,以查找包含该行最大值的列索引。这就是sapply无法正常运行的原因,默认情况下, 会向下看各列。 which.max
还处理向量-在您的情况下,您不想返回每个向量内的索引,因为它是指列向量,而不是data.frame的行。 / p>
这基本上是max
函数和pmax
函数之间的区别。 which.max
的逐行版本是max.col
,因此您可以指定:
DF1 %>% mutate(max_ind=max.col(DF1))
然后您可以选择要指定的列:
# only considering columns 1 and 2
DF1 %>% mutate(max_ind=max.col(DF1[,1:2]))
答案 2 :(得分:2)
尝试使用sizeof (dirbuf)
:
NULL
输出:
purrr::pmap