【问题标题】:How to delete some specific rows in a matrix in R如何删除R中矩阵中的某些特定行
【发布时间】:2016-10-14 11:17:31
【问题描述】:

我有一个矩阵,我只想保留那些至少有一个成员大于 5 的行。我的意思是那些成员都小于 5 的行应该被过滤掉。

例如:

2 4 6 2 1
1 2 3 1 2
5 4 7 2 1

在这个矩阵中,第二行应该被过滤掉,因为它的所有成员都小于5。

这是我写的:

for(i in 1:length(matrix[,1]){
for(j in 2:17){
if(any(matrix[i,j]>=5)){matrix=matrix} else {matrix=matrix[-i,]}
}}

但它不起作用。

你觉得我能做什么?

【问题讨论】:

    标签: r matrix rows


    【解决方案1】:

    改编this中的一些建议...

    1) 确定应该删除哪些行:

    a<- read.table(text = "2 4 6 2 1
                           1 2 3 1 2
                           5 4 7 2 1")
    
    a
         V1 V2 V3 V4 V5
    [1,]  2  4  6  2  1
    [2,]  1  2  3  1  2
    [3,]  5  4  7  2  1
    
    bye <- sapply(1:3, function(x){all(a[x,]<5)})
    bye
    [1] FALSE  TRUE FALSE
    

    2) 使用它来对矩阵进行子集化:

    a2 <- a[!bye,]
    a2
         V1 V2 V3 V4 V5
    [1,]  2  4  6  2  1
    [2,]  5  4  7  2  1
    

    【讨论】:

    • 听起来不错,但是当您有数千行时,这种方法可能有点困难......在这种情况下您有什么建议?
    • 我用 5000x5000 矩阵试了一下,效果很好。有点慢。不知道你所说的“有点困难”是什么意思。也许其他人有一个更有效的解决方案的想法。您可以将上述内容封装在一个函数 filter &lt;- function(m,n){ b &lt;- sapply(1:length(m[1,]), function(x){all(m[x,]&lt;n)}) m[!b,] } 中,其中 m 是您的矩阵,n 是定义您的最大值的数字。
    • 再想一想!您可以使用 dyplr 包中的 filter() 函数。该命令如下所示:a %&gt;% filter(rowSums(. &gt;=n) &gt;0),其中 n 是您要过滤的数字。只需确保 a 是一个数据框即可。
    • 非常感谢...您的代码运行良好...问题是我的第一列是字符,其余的是数字...所以当我尝试将您的代码应用于我的矩阵时,它无法处理第一列,然后结果不准确...我必须保留第一个数字,因为它是每个主题的名称,在进一步分析中很重要...请你帮我知道我能做什么?
    • 我必须保留第一列*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多