0

下面的可重现示例。我有一个模拟循环,在其中我偶尔需要从矩阵中删除行。我通过在需要在特定位置删除的行中输入“NA”值来完成此操作,然后我有一行代码来删除任何带有 NA 的行。到目前为止,这非常有效。我的问题是,我现在以某种方式运行模拟,偶尔会将我的矩阵缩减为一行。然后发生这种情况,矩阵被转换为“字符”,并使模拟崩溃。

例子:

mat<-matrix(1:10,5,2) #setting up a simplified example matrix
mat[3:5,1]<-NA #Giving 3 rows 'NA' values, for removal of these rows
mat<-mat[!is.na(mat[,1]),] #An example where my procedure works just fine
class(mat)    
mat[2,1]<-NA #Setting 1 of the remaining 2 rows as NA
mat<-mat[!is.na(mat[,1]),] #Removing one of final two rows
class(mat) #No longer a matrix

有什么方法可以做到这一点,我不会在最后丢失我的格式作为矩阵?我假设这个问题来自我使用“is.na”命令,但我还没有找到使用它的好方法。

为了更深入地了解这个问题,如果有更好的方法来做到这一点,我太天真了,还没有找到......在我的现实生活模拟中,我在矩阵中有一个列,其中包含一个'给定行中的个人活着时为 1,死亡时为 0。当一个人(单行)死亡时(并且值从“1”变为“0”),我需要删除该行。我知道如何做到这一点的唯一方法是将“0”更改为“NA”,然后删除所有带有 NA 的行。如果有一种方法可以删除特定列中带有“0”的行来避免这个问题,那就太好了!

4

1 回答 1

3

默认情况下,该[函数将输出强制转换为可能的最低维度。在您的示例中,您有一个二维数组(矩阵):提取单行时,它被强制转换为字符向量。

为避免这种情况,请查看drop该功能的选项[。你应该这样做:

mat <- mat[!is.na(mat[,1]),, drop = FALSE]
于 2012-06-30T22:01:08.117 回答