使用文本数据及循环填充R数据框失败的技术咨询
问题分析与解决方案
咱们先拆解下你代码里的几个核心问题,然后给出修正后的实现:
代码里的关键问题
- 变量名不一致:你定义的文本集合是
us_docx,但循环里却用了us_doc,这会直接导致"找不到对象"的报错; - 正则匹配不精准:原文本里的手册名称是
Employee Handbook 2019. docx(句号后有空格),但你写的匹配规则是Employee Handbook 2019.docx(无空格),所以根本匹配不到目标内容; rbind用法错误:你直接把单个值(比如i、handbook)和空数据框绑定,会导致数据框结构完全混乱,应该每次构建一行的小数据框再合并;- 初始数据框的问题:空数据框直接
rbind容易出现类型不兼容的问题,用列表先收集每行数据再合并更稳妥。
修正后的完整代码
# 模拟文本数据 us_doc1 <- "This is a sample text which has lots of bla bla bla text data. Employee Handbook 2019. docx Page 1." us_doc2 <- "This is another sample text which has lots of bla bla bla text data. Employee Handbook 2019. docx Page 2." us_docx <- unlist(list(us_doc1, us_doc2)) # 用列表收集每行数据(比循环rbind效率更高) usDoc_list <- list() # 循环处理每一页文本 for (i in seq_along(us_docx)) { # 读取当前页文本 x <- us_docx[i] # 移除多余空格,统一格式 x <- gsub("\\s+", " ", x) # 按句号(带可选空格)分割句子 x_split <- unlist(strsplit(x, "\\.\\s*")) # 提取手册名称:兼容文本里的空格格式 handbook <- x_split[grep(pattern = "Employee Handbook 2019.*docx", x_split, ignore.case = TRUE)] # 提取页码信息 PageReference <- x_split[grep(pattern = "docx Page", x_split, ignore.case = TRUE)] # 提取开头的主文本内容 main_text <- x_split[1] # 将当前行数据存入列表 usDoc_list[[i]] <- data.frame( v1 = i, v2 = handbook, v3 = PageReference, v4 = main_text, stringsAsFactors = FALSE ) } # 合并列表为最终数据框 usDoc <- do.call(rbind, usDoc_list) # 查看结果 print(usDoc)
运行后会得到你期望的结构:
v1 v2 v3 v4 1 1 Employee Handbook 2019. docx docx Page 1 This is a sample text which has lots of bla bla bla text data 2 2 Employee Handbook 2019. docx docx Page 2 This is another sample text which has lots of bla bla bla text data
额外优化小建议
- 用
seq_along(us_docx)代替1:length(us_docx),避免当文本集合为空时出现无效的1:0循环; - 如果需要进一步清理
v2列的格式(比如去掉多余空格),可以加一行handbook <- gsub("\\s+", " ", handbook); - 数据量较大时,用列表收集再合并的方式比循环里反复
rbind效率高很多。
内容的提问来源于stack exchange,提问作者loveR
相关产品推荐
相关产品推荐

