使用rows_append()时添加因子水平以避免类型转换错误
解决dplyr::rows_append()合并因子数据集的报错问题
问题根源
这个报错是因为两个数据集的Species因子水平不匹配:data1经过droplevels()后,Species只剩setosa和versicolor两个水平;data2则只有virginica。rows_append()要求目标数据集(x)的列类型必须兼容新增数据集(y)的列,因子水平不兼容时就会触发转换错误。
三种可行解决方案
1. 统一因子水平后合并
先提取两个数据集里所有的因子水平,重新赋值给两个数据集的Species列,再执行合并:
library(dplyr) data1 <- iris[1:100,] %>% droplevels() data2 <- iris[101:150,] %>% droplevels() # 获取所有唯一的因子水平 all_species <- union(levels(data1$Species), levels(data2$Species)) # 重新设置两个数据集的因子水平 data1$Species <- factor(data1$Species, levels = all_species) data2$Species <- factor(data2$Species, levels = all_species) # 正常合并 dataFull <- data1 %>% rows_append(data2) # 验证结果 levels(dataFull$Species) #> [1] "setosa" "versicolor" "virginica"
2. 转字符类型合并后转回因子
临时将因子列转为字符类型,合并完成后再重新转为因子:
dataFull <- data1 %>% mutate(Species = as.character(Species)) %>% rows_append( data2 %>% mutate(Species = as.character(Species)) ) %>% mutate(Species = factor(Species)) levels(dataFull$Species) #> [1] "setosa" "versicolor" "virginica"
3. 用bind_rows()替代(更简便)
如果不需要rows_append()的严格列匹配校验,bind_rows()会自动合并两个数据集的因子水平,写法更简洁:
dataFull <- bind_rows(data1, data2) levels(dataFull$Species) #> [1] "setosa" "versicolor" "virginica"
内容的提问来源于stack exchange,提问作者AdrieSC
相关产品推荐
相关产品推荐

