当 0 在 1 之间时,NA 不会在 R 中省略

NA won't omit in R when 0 is between 1's

我想更改表示图(顶​​点和边类型)的方阵并将其更改为表示相同图的列表

方阵:元素(i,j) = 1表示有一条边i -> j 列表:元素 i 是所有 j s.t 的向量(可能为空,编码为 NA)。有一条边 i -> j 我的问题是,如果行中间有一个零,它 returns 一个 NA 并且它只假设在向量为空(无边)时这样做。它只在两个 1 之间有一个 0 时才这样做。我不知道为什么 NA.omit 不起作用。 这是我第一次用 R 编程。

 squaretolist <- function(m){
        ml <- list() #creates an empty list that we will return at the end 
        for(i in 1:ncol(m)){ #loop through columns
            b1 <- c()
            for(j in 1:nrow(m)){ #loop through rows
                ifelse(m[i,j] %in% 1, b1[j] <- j, next)
            }
            ifelse(length(b1) == 0, ml[[i]]<- NA, ml[[i]] <- b1 )
        }
        return(ml)
    } 

在您的函数中,如果您在两个 1 之间有一个零,例如第一个位置和第三个位置的 1,则您将 b1[1] 分配给 1,b1[3] 分配给3 但是,因为你在第二个位置有一个 0,所以你没有将 b1[2] 分配给任何东西,所以它变成了 NA

为避免这种情况,您可以替换 ifelse(m[i,j] %in% 1, b1[j] <- j, next)
通过 ifelse(m[i,j] %in% 1, b1 <- c(b1,j), next).

您还可以使用 grepapply 函数获得您想要的内容:

ml <- apply(m, 1, function(i) {if(any(i==1)) grep(1, i) else NA})

这条指令告诉 R 为矩阵 m 的每一行应用一个 returns 的函数,如果至少有一个 1,则1(s) 的位置,否则 NA

示例:

set.seed(123)
m<-matrix(sample(c(0,1),25,replace=T),nrow=5)
m[4,]<-rep(0,5)

# > m
     # [,1] [,2] [,3] [,4] [,5]
# [1,]    0    0    1    1    1
# [2,]    1    1    0    0    1
# [3,]    0    1    1    0    1
# [4,]    0    0    0    0    0
# [5,]    1    0    0    1    1         

ml<-apply(m,1,function(i){if(any(i==1)) grep(1,i) else NA})
  # > ml
    # [[1]]
    # [1] 3 4 5

    # [[2]]
    # [1] 1 2 5

    # [[3]]
    # [1] 2 3 5

    # [[4]]
    # [1] NA

    # [[5]]
    # [1] 1 4 5