如何在R语言中按全大写单词拆分数据框列?
解决数据框字符列拆分问题
要实现将开头所有连续的全大写单词归入family列,剩余内容归入sp列,可以使用tidyr::extract函数结合精准正则表达式完成,具体方案如下:
核心思路
通过正则捕获开头的连续全大写单词(支持1个或多个空格分隔的全大写单词),同时捕获剩余全部内容,分别对应family和sp列。
实现代码
library(tidyverse) mydataframe <- data.frame(species= c("ACTINIDIACEAE Actinidia arguta", "ANACARDIACEAE Attilaea abalak E.Martínez & Ramos", "LEGUMINOSAE CAESALPINIOIDEAE Biancaea decapetala (Roth) O.Deg."), trait= c(1,2,4)) # 使用extract拆分目标列 mydataframe <- mydataframe %>% extract(species, into = c("family", "sp"), regex = "^(\\b[A-Z]+(?:\\s+[A-Z]+)*)\\s+(.*)$") # 查看结果 print(mydataframe)
结果说明
执行后得到符合预期的结果:
| family | sp | trait |
|---|---|---|
| ACTINIDIACEAE | Actinidia arguta | 1 |
| ANACARDIACEAE | Attilaea abalak E.Martínez & Ramos | 2 |
| LEGUMINOSAE CAESALPINIOIDEAE | Biancaea decapetala (Roth) O.Deg. | 4 |
原方案问题分析
你之前使用的separate搭配\\s+(?=[A-Z]+)正则存在两个问题:
- 该正则会在每个全大写单词前的空格处触发拆分,而
separate默认仅拆分指定数量的列(此处为2列),导致后续内容丢失; - 对于多全大写单词的字符串,会错误地将第二个全大写单词划入
sp列开头,不符合需求。
内容的提问来源于stack exchange,提问作者user18081990
相关产品推荐
相关产品推荐

