tidyverse中将字符串按换行符分割为data.frame行的问题求解
错误原因
你的代码报错是因为管道将tibble对象直接传递给str_split()时,函数默认将tibble作为待处理的字符串输入,str_split()无法直接识别tibble类型的输入值,同时重复指定string参数导致逻辑冲突,因此触发类型强制转换警告,最终输出NA。
正确实现代码
tidyverse体系下有两种常用的实现方案,均可得到你需要的输出:
方案1:str_split()结合unnest()
library(tidyverse) Test <- "ASD 7\nDEF \n This" tb <- tibble(Test = Test) %>% # 按换行符分割字符串,生成列表列 mutate(split_res = str_split(Test, pattern = "\n")) %>% # 将列表列拆分为独立行 unnest(split_res) %>% # 去除每个字符串前后的空白,匹配期望输出 mutate(split_res = str_trim(split_res)) %>% # 按需保留列,此处仅保留拆分结果列 select(split_res)
方案2:直接使用separate_rows()(更简便)
separate_rows()是tidyr专门用于将单元格按分隔符拆分为多行的函数,写法更简洁:
library(tidyverse) Test <- "ASD 7\nDEF \n This" tb <- tibble(Test = Test) %>% # 直接按换行符拆分列并转为多行 separate_rows(Test, sep = "\n") %>% # 去除前后空白 mutate(Test = str_trim(Test))
输出结果
两种方案最终得到的tibble如下,完全匹配你的预期:
# A tibble: 3 × 1 Test <chr> 1 ASD 7 2 DEF 3 This
如果你不需要去除字符串前后的空格,删除str_trim()对应的步骤即可。
内容的提问来源于stack exchange,提问作者MYaseen208
相关产品推荐
相关产品推荐

