用Inf删除矩阵行

时间:2016-09-01 11:26:24

标签: r matrix nan cbind

我有三个列表,其中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    

上下文: 我想导出一个.txt文件,一些结果位于3个列表中,对我来说很容易就是使用cbind获取矩阵并使用

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

1 个答案:

答案 0 :(得分:2)

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

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

2)NaNNA具有特殊含义且不是字符串。通过使用引号"NaN",很难应用自定义函数is.nan/is.na来执行任何操作。所以,我们必须诉诸==/!=

3)不清楚为什么个人listcbind加入matrix

根据输入数据,我们可以使用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