R语言使用rbind函数合并数据报列数不匹配,核对列序仍报错如何解决?
报错原因
你触发该报错的核心原因是实际传入rbind的两个数据框列数不匹配:
你之前核对的是未做筛选的原始treat_firms_1year_prior和control_firms_year_int_tx,二者列名、列数确实完全一致,但你在调用rbind时,对第一个参数(处理组数据)做了列删除操作,移除了year_int_tx、matchingyear、flag三个列,处理后的处理组仅剩余18列;而第二个参数传入的是未做任何列筛选的对照组数据,仍保留全部21列,二者列数不一致因此触发报错。
修复方案
方案1:基础包rbind实现
对对照组数据同步执行相同的列删除操作后再合并即可:
# 对处理组执行列筛选 treat_filtered <- treat_firms_1year_prior[, -c( grep("year_int_tx", colnames(treat_firms_1year_prior)), grep("matchingyear", colnames(treat_firms_1year_prior)), grep("flag", colnames(treat_firms_1year_prior)) )] # 对对照组执行相同的列筛选 control_filtered <- control_firms_year_int_tx[, -c( grep("year_int_tx", colnames(control_firms_year_int_tx)), grep("matchingyear", colnames(control_firms_year_int_tx)), grep("flag", colnames(control_firms_year_int_tx)) )] # 合并两个数据框 matchData <- rbind(treat_filtered, control_filtered)
方案2:dplyr包bind_rows实现(更容错)
如果担心列顺序不一致导致后续问题,可以使用dplyr包的bind_rows函数,会自动按列名匹配对齐,容错性更高:
# 加载dplyr包 library(dplyr) # 处理组删除目标列 treat_filtered <- treat_firms_1year_prior %>% select(-year_int_tx, -matchingyear, -flag) # 对照组删除相同列 control_filtered <- control_firms_year_int_tx %>% select(-year_int_tx, -matchingyear, -flag) # 按列名匹配合并 matchData <- bind_rows(treat_filtered, control_filtered)
合并前校验方法
合并前可运行以下代码确认两个数据框列完全匹配:
# 查看两个待合并数据框的列数是否一致 ncol(treat_filtered) ncol(control_filtered) # 校验二者列名是否完全一致 # 结果返回character(0)说明不存在差异列 setdiff(colnames(treat_filtered), colnames(control_filtered)) setdiff(colnames(control_filtered), colnames(treat_filtered))
内容的提问来源于stack exchange,提问作者R Wd
相关产品推荐
相关产品推荐

