【问题标题】:Delete the rows of matrix with Inf [duplicate]用 Inf 删除矩阵的行 [重复]
【发布时间】:2017-01-09 06:21:06
【问题描述】:

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

【问题讨论】:

  • matrix[apply(matrix,1, function(x) all(is.finite(x))),]
  • 当然主题是相关的但不是重复的,显然应用程序和案例确实不同......有什么新东西但是混合现有功能以获得结果的方式是新的网站,所以感谢您报告问题的努力,但您完全错了..

标签: r matrix nan cbind


【解决方案1】:

关于该问题的一些建议。

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 

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 2011-12-26
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多