R语言data.frame行数不匹配报错:如何恢复表格原始结构?
解决
data.frame行数不匹配报错并恢复原始表格结构 嘿,我来帮你搞定这个报错问题!你遇到的Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 1,主要是代码里几个逻辑和数据定义的问题导致的,咱们一步步来修正:
先梳理报错根源
这个报错本质是你尝试合并的对象行数不一致,具体到你的代码里有几个核心问题:
- 输入数据的
number向量未完成定义:number<-c(2,11,12,5缺少闭合括号,且长度和sex、grade不一致(后两者都是8个元素,number当前只有4个),直接导致初始表格结构异常 - 函数内列名调用错误:你用了
mytable$N[i],但你的数据列名是number,两者不匹配 - 数据合并逻辑错误:你用
cbind(列绑定)来拼接行数据,但你想要的是按频数重复行并堆叠,应该用rbind(行绑定);且初始datatable<-NULL的处理方式会导致第一次合并时出现空对象与非空对象行数不匹配的问题
修正后的完整代码
第一步:修正输入数据
rm(list=ls()) # 补全number向量,使其长度与sex、grade一致(对应8个类别组合的频数) sex <- rep(c('M','F'), each=4) grade <- rep(c('B','C','D','E'), 2) number <- c(2,11,12,5, 3,9,7,4) # 创建规范的频数表 mytable <- data.frame(sex, grade, number)
第二步:修正自定义函数(循环实现)
Mytable <- function(mytable){ # 初始化空数据框,提前指定列类型避免绑定报错 datatable <- data.frame(sex = character(), grade = character(), stringsAsFactors = FALSE) rows <- nrow(mytable) for(i in 1:rows){ # 取出当前行的类别信息 current_row <- mytable[i, c("sex", "grade")] # 按频数重复当前行,并堆叠到结果表中 datatable <- rbind(datatable, do.call("rbind", replicate(mytable$number[i], current_row, simplify = FALSE))) } # 重置行名,避免混乱 rownames(datatable) <- NULL return(datatable) } # 运行函数得到原始结构的表格 result <- Mytable(mytable) print(result)
更高效的替代写法(无需循环)
如果你不想用循环,R里可以直接用rep函数实现频数展开,代码更简洁:
result_simple <- data.frame( sex = rep(mytable$sex, mytable$number), grade = rep(mytable$grade, mytable$number), stringsAsFactors = FALSE ) rownames(result_simple) <- NULL print(result_simple)
效果说明
修正后的代码会把你的频数汇总表(每行是一个类别组合+对应频数),展开成原始单条记录结构(每行代表一个样本的性别和年级信息),完美解决了行数不匹配的报错问题。
内容的提问来源于stack exchange,提问作者jackray




