【问题标题】:Extract all characters before Parenthesis R提取括号 R 之前的所有字符
【发布时间】:2021-09-01 16:56:38
【问题描述】:

我想有一个简单的正则表达式解决方案 - 我想提取出现在名称列中第一个左“(”括号之前的所有内容。

我当前的代码返回这个:

df$New_Name <- strsplit(df$Name, '[()]')[[1]][[1]]

Name          New_Name 
1abc (55x50)  1abc
1abc (50x40)  1abc
2def (20x15)  1abc
2def (25x12)  1abc
3ghi (30x5)   1abc
3ghi (30x10)  1abc

我正在运行的代码仅适用于第一个实例。对于 2def、3ghi 等,它没有返回正确的字符串。

期望的输出:

Name          New_Name 
1abc (55x50)  1abc
1abc (50x40)  1abc
2def (20x15)  2def
2def (25x12)  2def
3ghi (30x5)   3ghi
3ghi (30x10)  3ghi

【问题讨论】:

    标签: r regex data-manipulation strsplit


    【解决方案1】:

    strsplit 返回一个list。通过提取第一个元素[[1]],它只返回第一个list 元素的内容。然后,无论提取什么值,即第一个列表元素 [[1]][[1]] 的第一个元素,它只是一个值,通过赋值,它会被回收

    df$New_Name <- sapply(strsplit(df$Name, '\\s*[()]'), `[`, 1)
    

    在上面的代码中,不是提取第一个元素,而是用sapply循环list,然后提取第一个元素


    另一个选项是trimws,通过将whitespace 中的正则表达式指定为零或多个空格(\\s*)后跟( 和其他字符(.*

    df$New_Name <- trimws(df$Name, whitespace = "\\s*\\(.*")
    

    或者可以使用sub

    df$New_Name <- sub("\\s*\\(.*", "", df$Name)
    

    -输出

    df
              Name New_Name
    1 1abc (55x50)     1abc
    2 1abc (50x40)     1abc
    3 2def (20x15)     2def
    4 2def (25x12)     2def
    5  3ghi (30x5)     3ghi
    6 3ghi (30x10)     3ghi
    

    数据

    df <- structure(list(Name = c("1abc (55x50)", "1abc (50x40)", "2def (20x15)", 
    "2def (25x12)", "3ghi (30x5)", "3ghi (30x10)")), row.names = c(NA, 
    -6L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多