在for循环中使用cbind()合并数据框时遇列数不匹配问题
问题
循环遍历数据框行时想给原始数据框新增列,但执行cbind()后因列数不匹配无法保存修改。提前创建列名设为NA也没解决,简化示例如下:
原始数据框:
myDat <- data.frame( id = c(1,2,3,4), name = c("john","james","steve","david"), city = c("london","manchester","hull","birmingham") ) myDat2 <- data.frame( att1 = c(23,25,44,30), att2 = c(21,30,28,28) )
尝试的循环代码:
for(i in 1:nrow(myDat)){ # 示例中i=1时仅取myDat2第一行 myDat2 = data.frame(att1 = 23, att2 = 21) myDat[i,] = cbind(myDat[i, ], mydat2) }
报错信息:
number of items to replace is not a multiple of replacement length
解决方案
1. 提前为原始数据框新增列并初始化
先给myDat添上要新增的列,初始值设为NA,保证整个数据框列数统一:
myDat$att1 <- NA myDat$att2 <- NA
2. 循环中直接赋值对应行的新增列
不要用cbind替换整行,而是直接修改对应行的新增列值:
for(i in 1:nrow(myDat)){ # 根据实际逻辑生成当前行的myDat2数据(示例中取myDat2第i行) current_att <- myDat2[i, ] # 给myDat第i行的att1和att2赋值 myDat[i, c("att1", "att2")] <- current_att }
错误原因
原来的myDat[i,]只有3列(id、name、city),cbind(myDat[i,], myDat2)会生成5列的数据,用5列去替换3列的位置,必然出现长度不匹配的错误。提前建好列后,整个数据框列数一致,只需要修改对应行的目标列即可。
补充:无需循环的场景(如果适用)
如果你的myDat2和myDat行数完全对应,直接合并就行,不需要循环:
myDat <- cbind(myDat, myDat2)
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

