R语言遍历表格逐行插入新行并复制上一行指定列值的实现方法
R实现原行下方插入指定取值新行的方案
原代码的错误点
- 索引越界:循环i从1开始,取
i-1=0作为行索引,R中不存在0行,运行会直接报错 - 迭代逻辑错误:每次
add_row都基于原始未修改的text_data操作,没有承接上一轮循环生成的text_data_refined,最终只会保留最后一次插入的单行结果 - 参数使用错误:
add_row的.after参数需要传入目标行的数字索引,不能直接传入整行数据集 - 逐行循环插入的写法效率极低,数据量稍大时运行卡顿明显
正确实现代码
不需要写循环,用向量化操作拼接数据即可,运行快且不会出现索引类错误:
library(dplyr) # 读取原始数据,和你原有读取逻辑一致 text_data <- read.delim( "C:\\Users\\Kavin Kadam\\Desktop\\UBC\\PCIGR\\IoliteOutlier\\Individual Answers_472.txt", skip = 19, header = FALSE ) # 生成所有待插入的新行:V1-V5依次取原行V9-V13的值,其余列默认留空 insert_rows <- text_data %>% transmute( V1 = V9, V2 = V10, V3 = V11, V4 = V12, V5 = V13 ) # 加排序标记:原行占奇数位,对应要插入的新行占紧随其后的偶数位,保证新行插在对应原行正下方 text_data$.sort_tag <- seq(from = 1, to = 2*nrow(text_data), by = 2) insert_rows$.sort_tag <- seq(from = 2, to = 2*nrow(text_data), by = 2) # 合并数据、按标记排序,最后删掉辅助排序的列即得到最终结果 text_data_refined <- bind_rows(text_data, insert_rows) %>% arrange(.sort_tag) %>% select(-.sort_tag)
这种写法完全规避了循环操作的索引问题,全程为向量化运算,哪怕十万行级别的数据也能秒级完成处理。
结果说明
处理后的数据完全符合规则:
- 所有原始行完整保留自身V1-V13列的原有取值
- 每一行原始数据下方紧跟一行新记录,新记录V1-V5依次承接上一行原数据V9-V13的取值,其余列为空值,匹配预期输出要求。
内容的提问来源于stack exchange,提问作者Kavin Kadam
相关产品推荐
相关产品推荐

