2017-09-05 71 views
0

如果我有一个矩阵:max.col与值而不是索引

mod_xgb_softprob$pred[1:3,1:3] 
      [,1]   [,2]   [,3] 
[1,] 6.781361e-04 6.781361e-04 6.781422e-04 
[2,] 2.022457e-07 2.022457e-07 4.051039e-07 
[3,] 6.714367e-04 6.714367e-04 6.714399e-04 

通过生成:

> dput(mod_xgb_softprob$pred[1:3,1:3]) 
structure(c(0.00067813612986356, 2.02245701075299e-07, 0.000671436660923064, 
0.00067813612986356, 2.02245701075299e-07, 0.000671436660923064, 
0.000678142241667956, 4.05103861567113e-07, 0.000671439862344414 
), .Dim = c(3L, 3L)) 

我可以转化成数据帧和最高得到列值:

x <- mymatrix %>% as.data.frame %>% mutate(max_prob = max.col(., ties.method = "last")) 

是这样的:

> x 
      V1   V2   V3 max_prob 
1 6.781361e-04 6.781361e-04 6.781422e-04  3 
2 2.022457e-07 2.022457e-07 4.051039e-07  3 
3 6.714367e-04 6.714367e-04 6.714399e-04  3 

如果我想max_prob是实际值而不是列索引,我该怎么做?

+0

矩阵indexing:'mod_xgb_softprob [cbind(1:nrow(mod_xgb_softprob),max.col(mod_xgb_softprob))]'。 – lmo

+0

这是[高度相关的帖子](https://stackoverflow.com/questions/3071271/add-a-variable-to-a-data-frame-containing-max-value-of-each-row/46060812# 46060812)。其中,我为这些方法添加了不同大小数据帧的时间。 – lmo

回答

1

如果您不介意base R,则可以使用apply。例如:

> x <- matrix(rnorm(9), ncol = 3) 
> apply(x, 1, max) 
[1] 0.246652 1.063506 2.148525 

给出了最大列向量x

+0

我认为你的意思是'apply(x,1,max)'。那么结果将是'cbind(x,apply(x,1,max))'。 –

+0

@Moody_Mudskipper - 是按行,谢谢+更正 – Marianne

2

除了从@Mariane的apply方法和矩阵索引从@ LMO的评论,你也可以使用matrixStats::rowMaxs

matrixStats::rowMaxs(mymatrix) 
# [1] 6.781422e-04 4.051039e-07 6.714399e-04 

如果你有一个数据帧时,您可以使用do.call(pmax, ...)计算并行输入列的最大值:

mymatrix %>% as.data.frame %>% mutate(max_val = do.call(pmax, .)) 

#   V1   V2   V3  max_val 
#1 6.781361e-04 6.781361e-04 6.781422e-04 6.781422e-04 
#2 2.022457e-07 2.022457e-07 4.051039e-07 4.051039e-07 
#3 6.714367e-04 6.714367e-04 6.714399e-04 6.714399e-04 
+0

非常感谢。特别是像do.call()一样,它适合整齐地输入较少的内容,但除了她首先回答的问题外,没有其他原因与Marianne一起使用。顺便说一句,我认为do.call()只能在列表上工作?总是努力让自己的头脑完全发挥它的作用,我只倾向于在复制粘贴别人的代码时使用它 –

+1

Plz随时接受@ Marianne的回答,这是第一个正确的答案。在R data.frame是作为一个列表来实现的,如果你使用'unclass(df)',你可以更清楚地看到这一点;所以'do.call'也可以在数据框架上工作。 – Psidom

1

其使用max.colseq_along和另一种选择数学。如果m是你的矩阵,那么下面的作品,以及:

mc <- max.col(m, ties.method = 'last') 
m[(mc - 1) * nrow(m) + seq_along(mc)] 

结果:

[1] 6.781422e-04 4.051039e-07 6.714399e-04 

随着cbind可以比这个结果再次与矩阵:

> cbind(m, m[(mc - 1) * nrow(m) + seq_along(mc)]) 
      [,1]   [,2]   [,3]   [,4] 
[1,] 6.781361e-04 6.781361e-04 6.781422e-04 6.781422e-04 
[2,] 2.022457e-07 2.022457e-07 4.051039e-07 4.051039e-07 
[3,] 6.714367e-04 6.714367e-04 6.714399e-04 6.714399e-04 
相关问题