如何在R中修复:下标作业中不允许有缺失值

1,141 阅读1分钟

你在使用R时可能遇到的一个错误信息是:

Error in `[<-.data.frame`(`*tmp*`, df$A == 5, , value = list(A = c(NA,  : 
  missing values are not allowed in subscripted assignments of data frames

这个错误通常发生在你试图用另一列的值来分配一列的值,但刚好有NA值存在。

下面的例子说明了如何在实践中解决这个错误。

如何重现该错误

假设我们在R中创建了以下数据框:

#create data frame
df <- data.frame(A=c(3, 4, 4, NA, 5, 8, 5, 9),
                 B=c(12, 13, 7, 7, 12, 11, 15, 7))

#view data frame
df

   A  B
1  3 12
2  4 13
3  4  7
4 NA  7
5  5 12
6  8 11
7  5 15
8  9  7

现在假设我们试图给B列的每一行分配一个10的值,而A列的相应值等于5。

#attempt to assign column B a value of 10 where A is equal to 5
df[df$A == 5, ]$B <- 10

Error in `[<-.data.frame`(`*tmp*`, df$A == 5, , value = list(A = c(NA,  : 
  missing values are not allowed in subscripted assignments of data frames

我们会收到一个错误,因为A列中有NA值,而且错误信息中明确告诉我们,在数据框架的下标分配中不允许有缺失的值

如何避免该错误

有两种方法可以避免这个错误。

1.使用%in%操作符

避免这个错误的方法之一是在执行赋值时使用%in%操作符。

#assign column B a value of 10 where A is equal to 5
df[df$A %in% 5,]$B <- 10

#view updated data frame
df

   A  B
1  3 12
2  4 13
3  4  7
4 NA  7
5  5 10
6  8 11
7  5 10
8  9  7

请注意,在B列的每一行都被赋值为10,而A列的对应值等于5,我们没有收到任何错误。

2.使用is.na()

另一个避免这种错误的方法是在执行赋值时使用is.na()函数。

#assign column B a value of 10 where A is equal to 5
df[!is.na(df$A) & df$A == 5, ]$B <- 10

#view updated data frame
df

   A  B
1  3 12
2  4 13
3  4  7
4 NA  7
5  5 10
6  8 11
7  5 10
8  9  7

再一次,我们能够为B列的每一行赋值10,而A列的对应值等于5,我们没有收到任何错误。

其他资源

下面的教程解释了如何修复R中的其他常见错误:

如何在R中修复。参数意味着不同的行数
如何在R中修复:选择未使用参数的错误
如何在R中修复:替换长度为0