当 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)
.
您还可以使用 grep
和 apply
函数获得您想要的内容:
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
我想更改表示图(顶点和边类型)的方阵并将其更改为表示相同图的列表
方阵:元素(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)
.
您还可以使用 grep
和 apply
函数获得您想要的内容:
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