R:对于每一行,找到具有最高值的列的列索引

时间:2019-07-14 10:29:15

标签: r dplyr data.table

我试图获取所选列中具有最高值的列的索引。尝试使用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可以使用的。有没有想到如何在basetidyversedata.table中做到这一点?

Edit-1(其他尝试)

有了蓝宝石,我得到了:

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。

Edit-2

我还在寻找一种解决方案,我们可以指定用于比较的列(which.max

编辑3

所有basepurrr::mapdplyr::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

3 个答案:

答案 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