应用 NaN 删除 columns/rows

Delete columns/rows with NaN with 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))]

用于列,但我想使用应用。

我试过使用这个 (sol 1):

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

但它显示了前两列。

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

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

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

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

要练习 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
m[!is.na(rowSums(m)),!is.na(colSums(m))]

不需要求和

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()