我试图通过检查数据帧的值来构建向量。我想我在检查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]])
}
它包含一些示例数据并执行您描述的过程。