R语言如何修复:Invalid factor level, NA generated in R
在这篇文章中,我们将通过实例来研究如何修复错误: 无效的因子水平,生成NA。
当程序员试图向R语言中的因子变量添加一个事先不存在的定义水平的值时,编译器会产生这样的警告信息。完整的警告信息在下面给出。
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "C") :
invalid factor level, NA generated
何时可能发生错误
让我们创建一个数据框。
# Create a data frame
dataframe < - data.frame(team=factor(c('Alpha', 'Alpha',
'Beta', 'Beta',
'Charlie', 'Charlie',
'Charlie')),
points=c(96, 91, 86, 89, 93, 87, 91))
# Display the data frame
dataframe
# Display the structure of the data frame
str(dataframe)
输出
在这个例子中,团队变量只有三种类型的值:”Alpha”、”Beta”、”Charlie”。现在,我们将尝试在数据框的最后插入一个额外的行,该行的队名等于 “Gamma”。
例子
# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha',
'Beta', 'Beta',
'Charlie', 'Charlie',
'Charlie')),
points=c(96, 91, 86, 89, 93, 87, 91))
#add new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
输出
输出
编译器产生了警告信息。这是因为 “Gamma “这个值还没有出现在团队列下。请注意,这只是一个警告信息,编译器会自动在数据框的末尾插入一个新的行,但单元格中没有 “Gamma”,其值将等于NA。
# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha',
'Beta', 'Beta',
'Charlie', 'Charlie',
'Charlie')),
points=c(96, 91, 86, 89, 93, 87, 91))
# add new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
# Display the dataframe
dataframe
输出
如何避免这个警告
我们可以通过首先将因子变量转换为字符变量,然后在添加额外的行之后再将其转换为因子变量来摆脱这个警告。
例子
# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha',
'Beta', 'Beta',
'Charlie', 'Charlie',
'Charlie')),
points=c(96, 91, 86, 89, 93, 87, 91))
# Convert team variable to character
dataframeteam <- as.character(dataframeteam)
# Insert a new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
# Transform team variable back to factor
dataframeteam <- as.factor(dataframeteam)
# Display the data frame
dataframe
输出
正如你在输出中看到的,警告以及 “NA “的东西已经从数据框架中消除了。现在让我们来显示一次修改后的数据框架的结构。
# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha',
'Beta', 'Beta',
'Charlie', 'Charlie',
'Charlie')),
points=c(96, 91, 86, 89, 93, 87, 91))
# Convert team variable to character
dataframeteam <- as.character(dataframeteam)
# Insert a new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
# Transform team variable back to factor
dataframeteam <- as.factor(dataframeteam)
# Display the structure of the data frame
str(dataframe)
输出