2016-09-27 326 views
-1

我正在處理一個函數,以便爲每一行返回最大值的列名稱。喜歡的東西:如何在R中替換NA與NA

colnames(x)[apply(x,1,which.max)] 

然而,在提出申請前這樣的功能是有一個直接的和通用的方式,以取代與NA(或任何其他任意字母等)的關係?

我有以下矩陣:

   0   1 
[1,] 5.000000e-01 0.5000000000 
[2,] 9.901501e-01 0.0098498779 
[3,] 9.981358e-01 0.0018641935 
[4,] 9.996753e-01 0.0003246823 
[5,] 9.998598e-01 0.0001402322 
[6,] 1.303731e-02 0.9869626938 
[7,] 1.157919e-03 0.9988420815 
[8,] 6.274074e-07 0.9999993726 
[9,] 1.659164e-07 0.9999998341 
[10,] 6.517362e-08 0.9999999348 
[11,] 8.951474e-06 0.9999910485 
[12,] 5.070740e-06 0.9999949293 
[13,] 1.278186e-07 0.9999998722 
[14,] 9.914646e-08 0.9999999009 
[15,] 7.058751e-08 0.9999999294 
[16,] 2.847667e-09 0.9999999972 
[17,] 1.675766e-08 0.9999999832 
[18,] 2.172290e-06 0.9999978277 
[19,] 4.964820e-06 0.9999950352 
[20,] 1.333680e-07 0.9999998666 
[21,] 2.087793e-07 0.9999997912 
[22,] 2.358360e-06 0.9999976416 

第一行具有用於我想與NA來替換變量相等的值。雖然這是簡單的爲這個特殊的例子,我希望能夠以取代NA,他們出現在任何規模的矩陣,即在這個矩陣中的所有關係:

 1  2 3 
[1,] 0.25 0.25 0.5 
[2,] 0.3 0.3 0.3 

所有值將與NA除了取代爲1 ,3]

我看過功能which.max.simple()可以通過與NA更換處理的關係,但它似乎沒有工作了,和處理關係的所有其他方法沒有解決我的問題

我希望有道理

個謝謝, Ç

+0

試圖尋找與浮點數精確匹配的方式並不總是按照您認爲的方式工作。請參閱[爲什麼這些數字不相等](http://stackoverflow.com/questions/9508518/why-are-these-numbers-not-equal) – MrFlick

+0

如果您將所有關係替換爲NA,並且並列值恰好是在行中的最大值,你將如何解決這個場景 – OdeToMyFiddle

回答

2

這裏有一個簡單的方法在矩陣mNA更換任何行方向重複值:

is.na(m) <- t(apply(m, 1, FUN = function(x) { 
       duplicated(x) | duplicated(x, fromLast = TRUE)})) 

但考慮以下事項:

1)是比較浮點數是否相等時要格外小心(請參閱Why are these numbers not equal?);

2)根據您的最終目標,可能會有比替換數據中的重複項更簡單的方法(因爲您似乎只對列名感興趣);和

3)如果你要在一個數字矩陣,以取代值,不要使用任意字符進行更換,因爲這將你的整個矩陣轉換爲字符類(置換NA是沒有問題的)

+0

嗯....它是一樣的嗎?我應該刪除嗎?我想我應該.. – Sotos