regex 如何在R中基于仅由大写字母组成的单词来分隔列

j13ufse2  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(134)

我想分隔一列字符串字符。在一栏里,我要所有大写的单词。字符串可以有一个或两个大写单词。下面是dataframe的一个例子:

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))

我尝试使用separate和下面的正则表达式:"\\s+(?=[A-Z]+)"。这不起作用。对于具有两个以上大写单词的字符串,它将第一个和第二个大写单词分开,删除字符串的其余部分。下面是代码:

mydataframe <- mydataframe %>%
              separate(species, into = c("family", "sp"), sep ="\\s+(?=[A-Z]+)")

这是代码的结果:
| 家庭|sp|特质|
| - -----|- -----|- -----|
| 猕猴桃科|软枣猕猴桃|1|
| 漆树科|阿巴拉阿提莱蛛|2|
| 豆科|海葵亚科|4|
我需要以下格式:
| 家庭|sp|特质|
| - -----|- -----|- -----|
| 猕猴桃科|软枣猕猴桃|1|
| 漆树科|阿巴拉阿提莱蛛|2|
| 豆亚科|无瓣扁盖蕨|4|

rsaldnfx

rsaldnfx1#

我认为我们可以使用(base)strcapture来查找一行中最后出现的两个大写字母,然后是空格,然后是至少有一个小写字母的单词。

mydataframe %>%
  mutate(strcapture("(.*[A-Z]{2,})\\s+(\\S*[a-z].*)", species, list(family="", sp="")))
#                                                          species trait                       family                                 sp
# 1                                 ACTINIDIACEAE Actinidia arguta     1                ACTINIDIACEAE                   Actinidia arguta
# 2               ANACARDIACEAE Attilaea abalak E.Martínez & Ramos     2                ANACARDIACEAE Attilaea abalak E.Martínez & Ramos
# 3 LEGUMINOSAE CAESALPINIOIDEAE Biancaea decapetala (Roth) O.Deg.     4 LEGUMINOSAE CAESALPINIOIDEAE  Biancaea decapetala (Roth) O.Deg.

相关问题