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

时间:2015-01-16 06:25:58

标签: r list function matrix dataframe

我想更改一个表示图形(顶点和边缘类型)的方形矩阵,并将其更改为表示同一图形的列表

方阵:元素(i,j)= 1表示存在边i - > Ĵ list:element i是所有j s.t.的向量(可能为空,编码为NA)。有一个边缘i - > Ĵ 我的问题是,如果行的中间有一个零,它返回一个NA,并且只有在向量为空(无边)时才会这样做。只有当零在两个1之间时才会这样做。我不知道为什么和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 个答案:

答案 0 :(得分:0)

在你的函数中,如果你在两个1之间有一个零,例如1在第1个位置和第3个位置,你将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的每一行应用一个函数,如果至少有一个1,则返回{{1}的位置其他1(s)

示例:

NA