我想更改一个表示图形(顶点和边缘类型)的方形矩阵,并将其更改为表示同一图形的列表
方阵:元素(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)
}
答案 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)
。
您还可以使用grep
和apply
函数获得所需内容:
ml <- apply(m, 1, function(i) {if(any(i==1)) grep(1, i) else NA})
该指令告诉R
对矩阵m
的每一行应用一个函数,如果至少有一个1
,则返回{{1}的位置其他1(s)
。
示例:
NA