如果行是 "empty",则用单个默认值交换矩阵中的 NA
Exchange NA's in a matrix with a single default value if row is "empty"
我有一个包含多列和多行的巨大矩阵。
它包含数值和 NA。
这是我的问题:
我有一些行仅由 NA 组成,这意味着它们基本上是空的。
这些行会干扰我的进一步计算,但我也不能只删除它们。
现在回答我的问题:
我可以在我的矩阵上使用一个快速函数来用相同的单个值替换这些行中的 NA(比如 0 或 99,这是无关紧要的!)?
但是-重要-仅对于空行(仅 NA)?
你只需要索引所有 NA 的行,然后用赋值替换它们。您可以使用 is.na()
、rowSums()
和 ncol()
来实现此目的。我把它们都写在下面,所以你可以看到工作:
x <- rbind(c(1, 2, NA), c(NA, NA, NA), c(NA, 5, 6), c(7, NA, 9))
x
is.na(x)
rowSums(is.na(x))
ncol(x)
# This is the single line that does all the work
x[rowSums(is.na(x)) == ncol(x),] <- 99
x
输出:
[,1] [,2] [,3]
[1,] 1 2 NA
[2,] NA NA NA
[3,] NA 5 6
[4,] 7 NA 9
[,1] [,2] [,3]
[1,] FALSE FALSE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE FALSE FALSE
[4,] FALSE TRUE FALSE
[1] 1 3 1 1
[1] 3
[,1] [,2] [,3]
[1,] 1 2 NA
[2,] 99 99 99
[3,] NA 5 6
[4,] 7 NA 9
mdat
C.1 C.2 C.3
row1 1 2 3
row2 11 12 13
rowpartNA 2 2 NA
rowNA NA NA NA
all.na.fun<- function(x)all(is.na(x))
apply(mdat, 1, all.na.fun)
row1 row2 rowpartNA rowNA
FALSE FALSE FALSE TRUE
> all.na.fun<- function(x)all(is.na(x))
(all.na.row<-apply(mdat, 1, all.na.fun))
row1 row2 rowpartNA rowNA
FALSE FALSE FALSE TRUE
mdat[all.na.row,] <-99
mdat
C.1 C.2 C.3
row1 1 2 3
row2 11 12 13
rowpartNA 2 2 NA
rowNA 99 99 99
矩阵:
m <- matrix(c(1,2,3,4,
NA,NA,NA,NA,
NA, 1, 2, 3,
1,2, NA, 4,
4,2,1,3), nrow=5, byrow = T )
语法:
m[which(rowSums(is.na(m))==ncol(m)),]=999
输出:
> m
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 999 999 999 999
[3,] NA 1 2 3
[4,] 1 2 NA 4
[5,] 4 2 1 3
我有一个包含多列和多行的巨大矩阵。 它包含数值和 NA。
这是我的问题: 我有一些行仅由 NA 组成,这意味着它们基本上是空的。 这些行会干扰我的进一步计算,但我也不能只删除它们。
现在回答我的问题:
我可以在我的矩阵上使用一个快速函数来用相同的单个值替换这些行中的 NA(比如 0 或 99,这是无关紧要的!)? 但是-重要-仅对于空行(仅 NA)?
你只需要索引所有 NA 的行,然后用赋值替换它们。您可以使用 is.na()
、rowSums()
和 ncol()
来实现此目的。我把它们都写在下面,所以你可以看到工作:
x <- rbind(c(1, 2, NA), c(NA, NA, NA), c(NA, 5, 6), c(7, NA, 9))
x
is.na(x)
rowSums(is.na(x))
ncol(x)
# This is the single line that does all the work
x[rowSums(is.na(x)) == ncol(x),] <- 99
x
输出:
[,1] [,2] [,3]
[1,] 1 2 NA
[2,] NA NA NA
[3,] NA 5 6
[4,] 7 NA 9
[,1] [,2] [,3]
[1,] FALSE FALSE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE FALSE FALSE
[4,] FALSE TRUE FALSE
[1] 1 3 1 1
[1] 3
[,1] [,2] [,3]
[1,] 1 2 NA
[2,] 99 99 99
[3,] NA 5 6
[4,] 7 NA 9
mdat
C.1 C.2 C.3
row1 1 2 3
row2 11 12 13
rowpartNA 2 2 NA
rowNA NA NA NA
all.na.fun<- function(x)all(is.na(x))
apply(mdat, 1, all.na.fun)
row1 row2 rowpartNA rowNA
FALSE FALSE FALSE TRUE
> all.na.fun<- function(x)all(is.na(x))
(all.na.row<-apply(mdat, 1, all.na.fun))
row1 row2 rowpartNA rowNA
FALSE FALSE FALSE TRUE
mdat[all.na.row,] <-99
mdat
C.1 C.2 C.3
row1 1 2 3
row2 11 12 13
rowpartNA 2 2 NA
rowNA 99 99 99
矩阵:
m <- matrix(c(1,2,3,4,
NA,NA,NA,NA,
NA, 1, 2, 3,
1,2, NA, 4,
4,2,1,3), nrow=5, byrow = T )
语法:
m[which(rowSums(is.na(m))==ncol(m)),]=999
输出:
> m
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 999 999 999 999
[3,] NA 1 2 3
[4,] 1 2 NA 4
[5,] 4 2 1 3