2017-09-05 34 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 
相關問題