使用带有NaN的NaN删除列/行

时间:2015-11-12 14:28:54

标签: r apply

所以,我有以下矩阵m:

       [,1] [,2] [,3] [,4] [,5]
    v1    0    1    2    3    3
    v2    1    1   NaN   4    4
    v3    2    2    2    3    4
    v4   NaN   3    3    4    5
    v5    4   NaN   4    5    5

我需要消除具有NaN的列(和行)。 我发现了几种简单的方法,例如:

m[,!is.nan(colSums(m))]

列,但我想使用apply。

我尝试使用此(sol 1):

m[,!is.nan(apply(m,1,sum))]

但它显示了前两列。

我终于想出了这个(sol 2):

m2[,!as.logical(colSums(-apply(m2, 2, is.nan)))]

但我认为解决方案并不那么优雅。

有没有办法缩短它? 另外,为什么我的第一个解决方案不起作用?

3 个答案:

答案 0 :(得分:1)

要练习apply个功能,请记住逗号位置很重要。

m[,!is.nan(apply(m, 2, sum))]
   [,1] [,2]
v1    3    3
v2    4    4
v3    3    4
v4    4    5
v5    5    5

m[!is.nan(apply(m, 1, sum)),]
   [,1] [,2] [,3] [,4] [,5]
v1    0    1    2    3    3
v3    2    2    2    3    4

答案 1 :(得分:0)

m[!is.na(rowSums(m)),!is.na(colSums(m))]

答案 2 :(得分:0)

无需求和

m <- matrix(c(  
  0,    1,    2,    3,    3,
  1,    1,   NaN,   4,    4,
  2,    2,    2,    3,    4,
  NaN,   3,    3,    4,    5,
  4,   NaN,   4,   5,    5), 5, byrow=TRUE)
m[!apply(is.na(m),1,any), !apply(is.na(m),2,any)]

或(如果您想要其他结果)is.nan()代替is.na()