【问题标题】:Splitting strings by case按大小写拆分字符串
【发布时间】:2020-06-05 10:28:26
【问题描述】:

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

df1 <- data.frame(a = c('lowercase U P P E R C A S E', 'letters N U M B E R S'), 
                  stringsAsFactors = FALSE)
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'),
                  stringsAsFactors = FALSE)
df2

我真的不知道从哪里开始做这样的事情。有什么想法吗?

【问题讨论】:

    标签: r string split uppercase lowercase


    【解决方案1】:

    有很多不同的方法可以做到这一点,但绝大多数都会使用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-z]+) 中捕获小写字母,然后在第二组(([A-Z] )*[A-Z]) 中捕获交替的大写和空格。然后它将整个字符串替换为 a 列的第一组的内容和 b 列的第二组的内容。

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

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

    这里,(?&lt;=[a-z]) 是匹配任何小写字母的后视,(?=[A-Z]) 是匹配任何大写字母的前瞻。因为在前瞻和后瞻之间有一个空格,它会用第一个空格分隔字符串,该空格直接位于小写字母之后和大写字母之前,这表示您尝试分隔两列的空间创建。

    【讨论】:

      【解决方案2】:

      我们可以使用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
      

      【讨论】:

        猜你喜欢
        • 2016-09-04
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 1970-01-01
        • 2019-12-03
        • 2011-03-08
        相关资源
        最近更新 更多