4

我有这个我命名为 N 的稀疏矩阵:

4 x 4 sparse Matrix of class "dgCMatrix"
   C1 C2 C3 C4
V1  .  3  5  2
V2  .  5  1  .
V3  .  .  .  .
V4  .  .  4  .

我正在尝试删除具有两个或多个缺失值的行。我希望最终得到这个:

   C1 C2 C3 C4
V1  .  3  5  2

我写了这段代码:

    #iterate on rows and count: 
    #how many values in row ri are bigger than 0
    # if count is not bigger than limit, remove row ri
    limit = 3
    for(ri in 1:nrow(N)){
    count <- length(which(N[ri,]>0))
    if (count <limit){ 
        tmp <- paste("V",ri,sep="")
        rmv <- paste (rmv, tmp, sep= " ")       
    }
}

#now remove specific row names
N <- N[!rownames(N) %in% rmv, ]

问题是 - 这不起作用,因为在第一个循环中 rmv 未指定并且我收到一个错误:

"object 'rmv' not found"

如何初始化rmv?如果我使用:

rmv <- ""

然后我得到一个以空格开头的字符串,例如:

> rmv
[1] " V2"

然后我的最后一行不起作用:

N <- N[!rownames(N) %in% rmv, ]

另外 - 这是我用 R 编写的第一个代码,所以如果我在基本概念中遗漏了什么重要的东西,我很乐意阅读它(这花了我 6 个小时,并且在 stackoverflow 中阅读了大量内容和不同的 R 教程,但我为自己能走到这一步感到非常自豪,这是我的第一个问题)。

谢谢!

4

2 回答 2

3

假设您的稀疏矩阵被调用N,这应该这样做:

N[rowSums(as.matrix(N) == 0) < 2, ]

一个小例子,其中一些数据来自?xtabs

d.ergo <- data.frame(Type = paste0("T", rep(1:4, 9*4)),
Subj = gl(9, 4, 36*4))
set.seed(15) # a subset of cases:
N <- xtabs(~ Type + Subj, 
           data = d.ergo[sample(36, 10), ], 
           sparse = TRUE)
N
# 4 x 9 sparse Matrix of class "dgCMatrix"
#    1 2 3 4 5 6 7 8 9
# T1 . 1 . 1 . 1 . 1 .
# T2 1 . . . . . 1 . 1
# T3 . . . . 1 . . . .
# T4 1 . . . . . 1 . .
rowSums(as.matrix(N) == 0) ## How many missing
# T1 T2 T3 T4 
#  5  6  8  7 
## Let's remove any with more than 7 missing
N[rowSums(as.matrix(N) == 0) < 7, ]
# 2 x 9 sparse Matrix of class "dgCMatrix"
#    1 2 3 4 5 6 7 8 9
# T1 . 1 . 1 . 1 . 1 .
# T2 1 . . . . . 1 . 1
于 2013-08-12T11:39:05.540 回答
2

对于大型稀疏矩阵,您需要使用矩阵的summary,否则as.matrix会使您的内存不足:

library(Matrix)

M <- sparseMatrix(i = c(1, 1, 1, 2, 2, 4),
                  j = c(2, 3, 4, 2, 3, 2),
                  x = c(3, 5, 2, 5, 1, 4))

M[tabulate(summary(M)$i) > 2, , drop = FALSE]
# 1 x 4 sparse Matrix of class "dgCMatrix"
#             
# [1,] . 3 5 2

一步一步来看看它是如何工作的:

summary(M)
# 4 x 4 sparse Matrix of class "dgCMatrix", with 6 entries 
#   i j x
# 1 1 2 3
# 2 2 2 5
# 3 4 2 4
# 4 1 3 5
# 5 2 3 1
# 6 1 4 2

tabulate(summary(M)$i)
# [1] 3 2 0 1

tabulate(summary(M)$i) > 2
# [1]  TRUE FALSE FALSE FALSE
于 2013-08-12T16:16:41.570 回答