我有一个大型的基于文本的数据框(约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
我确实不确定从哪里开始做这样的事情。有什么想法吗?
我们可以使用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
有很多不同的方法可以执行此操作,但是其中绝大多数将使用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])
是一个匹配任何大写字母的前瞻性。因为在向前和向后查找之间有一个空格,所以它将字符串分隔为第一个空格,该空格紧接在小写字母之后,而在大写字母之前,该字符表征了您试图将两列分开的空间创建。