检查索引并使用r处理缺失值

  • 本文关键字:处理 索引 r
  • 更新时间 :
  • 英文 :


我试图通过检查数据帧的值来构建向量。我想我在检查NA条件时遇到了问题。我想要完成的:

如果向量a上的索引i不是NA,向量b上的索引i也不是NA,那么将这些值存储在向量xp和yp中。否则,如果向量a的索引i是NA,但向量b的索引i有一个值(反之亦然),则将值存储在向量3和4中。当循环完成时,我应该有4个向量xp yp,有完整的值。xu将存储那些在vectorA中的索引i不为空但在vectorB中的索引i为空的值。你将存储的值在向量a的索引i是空的,但在向量b的索引i不是空的。本质上xp和yp是成对的完全数据,而xu和yu是不完全成对的数据。

在下面的代码中,我得到以下错误消息,在需要TRUE/FALSE的地方缺少值。

xp = numeric()
yp = numeric()
xu = numeric()
yu = numeric()
m = length(df$Q15)
for( i in 1:m)
{

if(df$Q15[i]!= NA & df$QA[i]!= NA) 

xp1[i]=df$Q15[i]
yp1[i]=df$QA[i]
}
else{

If(df$Q15[i] != NA & df$QA[i] == NA) xu[i]=df$Q15[i]
If(df$Q15i] == NA & df$QA[i] != NA) yu[i]=df$QA[i]
}

Error in if (df$Q15[i] != NA & df$QA[i] != NA) xp1[i] = df$Q15[i] : 
missing value where TRUE/FALSE needed

NA的任何操作都会产生NA,即不是TRUE/FALSE,这使得if()抱怨。要测试NA值,请使用is.na():

123 * NA
#> [1] NA
NA == NA
#> [1] NA
NA != NA
#> [1] NA
NA == TRUE
#> [1] NA
NA == FALSE
#> [1] NA
is.na(NA)
#> [1] TRUE
!is.na(NA)
#> [1] FALSE
is.na(FALSE)
#> [1] FALSE
!is.na(FALSE)
#> [1] TRUE

创建于2022-11-23与reprex v2.0.2

下面是一个可能的例子:

df <- data.frame(QA = sample(c(0L,1L,NA_integer_), size = 15, replace = TRUE, prob = c(0.4,0.4,0.2)),
Q15= sample(c(0L,1L,NA_integer_), size = 15, replace = TRUE, prob = c(0.2,0.4,0.4)))
xp <- numeric()
yp <- numeric()
xu <- numeric()
yu <- numeric()
# don't do this
# m = length(df$Q15)
for( i in seq_along(df$QA)){

### use is.na() instead of == NA
if( !is.na(df$Q15[[i]]) & !is.na(df$QA[[i]]) ){
### inserted missing brackets
xp <- c(xp,df$Q15[[i]])
yp <- c(yp,df$QA[[i]])
}

if( !is.na(df$Q15[[i]]) & is.na(df$QA[[i]]) )  xu <- c(xu,df$Q15[[i]])

if( !is.na(df$QA[[i]])  & is.na(df$Q15[[i]]) ) yu <- c(yu,df$QA[[i]])

}

它包含一些示例数据并执行您描述的过程。

最新更新