使用 Inf 删除矩阵的行

Delete the rows of matrix with Inf

我有三个列表,Inf 是数字变量,"NaN" 是字符变量。

    v1<-list(1,Inf,3,4,5,6,"NaN")
    v2<-list(1,"NaN",3,4,5,6,5)
    v3<-list(1,2,3,4,5,6,"NaN")

目前我可以用cbind做一个矩阵,但想要的结果是代码B)。

A) 我得到了什么:

matrix<-cbind(v1,v2,v3)
     v1    v2    v3   
[1,] 1     1     1    
[2,] Inf  "NaN"  2    
[3,] 3     3     3    
[4,] 4     4     4    
[5,] 5   Inf     5    
[6,] 6     6     6    
[7,]"NaN"  7   "NaN"

B) 我想得到:

     v1    v2    v3   
[1,] 1     1     1      
[2,] 3     3     3    
[3,] 4     4     4       
[4,] 6     6     6    

上下文: 我想将位于 3 个列表中的一些结果导出到 .txt 文件中,对我来说简单的方法是使用 cbind 获取矩阵并使用

write.table(matrix, file="mymatrix.txt", row.names=FALSE, col.names=FALSE)

关于这个问题的一些建议。

1) 最好不要将matrix对象命名为matrix.

2) NaNNA有特殊含义,不是字符串。通过使用引号 "NaN",很难应用自定义函数 is.nan/is.na 进行任何操作。所以,我们不得不求助于==/!=

3) 目前尚不清楚为什么 list 个人 cbindmatrix


根据输入的数据,我们可以用apply遍历'matrix'的列,然后遍历list的每个元素,检查是否有有限元并且不是 "NaN",得到 rowSums,否定(! - 将 0 元素转换为 TRUE,即行中的所有元素都是有限的,所有其他值都为 FALSE)。使用逻辑索引对行进行子集化。

 matrix[!rowSums(apply(matrix, 2, FUN = function(x) 
         sapply(x, function(y) !(is.finite(y) & y !="NaN")))),]
 #    v1 v2 v3
 #[1,] 1  1  1 
 #[2,] 3  3  3 
 #[3,] 4  4  4 
 #[4,] 6  6  6