按大小写分隔字符串

问题描述 投票:0回答:2

我有一个大型的基于文本的数据框(约10万行),其中每一行都是一个字符串,其中包含第一个小写字母,然后是大写字母,中间有空格。如下面:

df1 <- data.frame(a = c('lowercase U P P E R C A S E', 'letters N U M B E R S'))
df1

我正在尝试将字符串变成大写字母,然后将大写字符移到新列中(然后从原始列中删除它们)。所需的输出将如下所示:

df2 <- data.frame(a = c('lowercase', 'letters'),
                  b = c('U P P E R C A S E', 'N U M B E R S'))
df2

我确实不确定从哪里开始做这样的事情。有什么想法吗?

r string split uppercase lowercase
2个回答
0
投票

我们可以使用tidyr::extract

tidyr::extract(df1, a, c("a", "b"), "([a-z]+)([A-Z\\s]+)")

#          a                  b
#1 lowercase  U P P E R C A S E
#2   letters      N U M B E R S

0
投票

有很多不同的方法可以执行此操作,但是其中绝大多数将使用Regular Expressions

在R底下,您可以这样做:

df3 <- data.frame(
         a = gsub(pattern = "^([a-z]+) (([A-Z] )+[A-Z])$", replacement = "\\1", x = df1$a),
         b = gsub(pattern = "^([a-z]+) (([A-Z] )+[A-Z])$", replacement = "\\2", x = df1$a),
         stringsAsFactors = FALSE)

这里,gsub函数正在捕获括在括号中的第一组中的小写字母,然后捕获第二组中的交替大写和空格。然后,它将整个字符串替换为第a列的第一组的内容和第二列的b的内容。

另一种方法,这次使用前瞻和后向,以及separate包中的tidyr函数:

df4 <- tidyr::separate(df1, 
                       col = a, 
                       into = c("a", "b"), 
                       sep = "(?<=[a-z]) (?=[A-Z])")

[这里,(?<=[a-z])是一个匹配任何小写字母的后视,而(?=[A-Z])是一个匹配任何大写字母的前瞻性。因为在向前和向后查找之间有一个空格,所以它将字符串分隔为第一个空格,该空格紧接在小写字母之后,而在大写字母之前,该字符表征了您试图将两列分开的空间创建。

© www.soinside.com 2019 - 2024. All rights reserved.