如何在R

时间:2016-09-27 14:32:20

标签: r matrix

我正在处理一个函数来返回每行最大值的列名。类似的东西:

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

除[1,3]

外,所有值都将替换为NA

我已经查看了函数which.max.simple(),它可以通过替换NA来处理关系,但它似乎不再起作用,并且所有其他处理关系的方法都不会解决我的问题

我希望这是有道理的

谢谢, ç

1 个答案:

答案 0 :(得分:2)

以下是使用矩阵NA中的m替换任何行方式重复值的简单方法:

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不是问题)