你在使用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中的其他常见错误: