使用mutate创建line_id列时出现类型转换错误,寻求解决方案
问题解决:创建line_id列时的类型转换错误
错误原因分析
你的错误根源不在line_id的生成步骤,而是文本拆分阶段的代码逻辑错误:
enframe(strsplit(text, split = "\n"))用法错误:strsplit返回的是列表,直接用enframe会把整个列表转为一个单一的dataframe,而非对每行文本的拆分结果单独处理,导致后续unnest后生成的dataframe存在结构异常(比如包含列表列),触发后续mutate时的类型不匹配错误。str_remove(doc_id, ".txt")中的.未转义:.在正则表达式中匹配任意字符,会错误移除doc_id中任意字符加txt的部分,而非仅移除.txt后缀。
修复后的代码
推荐用更简洁的separate_rows直接完成文本拆分,避免嵌套结构问题:
split_text <- raw_text %>% separate_rows(text, sep = "\n") %>% # 按换行符直接拆分文本为多行 rename(text_raw = text) %>% mutate(doc_id = str_remove(doc_id, "\\.txt")) %>% # 转义点号,精准移除.txt后缀 filter(text_raw != "") %>% # 移除空行 mutate(line_id = row_number())
如果坚持使用strsplit+enframe,需用map对每行单独处理:
split_text <- raw_text %>% mutate(text = map(strsplit(text, "\n"), ~enframe(.x, name = NULL, value = "text_raw"))) %>% unnest(text) %>% mutate(doc_id = str_remove(doc_id, "\\.txt")) %>% filter(text_raw != "") %>% mutate(line_id = row_number())
验证要点
- 运行前可先用
glimpse(raw_text)检查原数据的列类型,确保text是字符列,无嵌套结构。 - 拆分后用
glimpse(split_text)确认所有列都是常规类型(无列表列),再执行line_id生成步骤。
内容的提问来源于stack exchange,提问作者stacksterppr
相关产品推荐
相关产品推荐

