【问题标题】:conditionally remove leading or trailing `.` character in R有条件地删除 R 中的前导或尾随 `.` 字符
【发布时间】:2017-10-10 16:41:17
【问题描述】:

我有一个名称向量,其中一些名称具有前导和尾随 . 字符,而有些则没有。这是一个例子:

test <- c('.name.1.','name.2','.name.3.')

我想有条件地删除这些名称中的前导和尾随 . 字符,以返回

c('name.1','name.2','name.3')

【问题讨论】:

    标签: r regex


    【解决方案1】:

    使用正则表达式:

    test <- c('.name.1.','name.2','.name.3.')
    gsub('^\\.|\\.$', '', test)
    # [1] "name.1" "name.2" "name.3"
    

    正则表达式中的两个反斜杠\\ 转义了点.,这实际上表示任何字符。插入符号^ 标记字符串的开头,美元符号$ 标记字符串的结尾。管道| 是一个逻辑“或”。所以本质上正则表达式匹配字符串开头的一个点或字符串末尾的一个点,并将其替换为一个空字符串。

    更多关于正则表达式的信息可以找到here和关于gsub和相关函数的信息here

    【讨论】:

      【解决方案2】:

      使用substr 函数的快速函数:

      fun1 <- function(x) substr(x, 1 + (1 * as.numeric(substr(x,1,1)=='.')), nchar(x) - (1 * as.numeric(substr(x, nchar(x), nchar(x)) == '.')))
      

      我们使用substr 在字符串的第一个和最后一个元素中检查.,然后我们再次使用substr 来提取文本的某些部分。例如,如果第一个字符中有.,但第二个字符没有,我们将提取:substr(text, 2, nchar(text))

      fun1(test)
      [1] "name.1" "name.2" "name.3"
      

      【讨论】:

        【解决方案3】:

        只是为了好玩,这里有一个substringgrepl 的方法。

        substring(test, 1L + grepl("^\\.", test), nchar(test) - grepl("\\.$", test))
        [1] "name.1" "name.2" "name.3"
        

        这可以将substring 替换为substr。这些函数最酷的地方在于它们将向量作为第二个和第三个参数。在这里,我们可以使用grepl 在第二个参数的 1L 和 2L 之间以及在最后一个字符的位置和倒数第二个字符之间递增。

        【讨论】:

          【解决方案4】:

          你也可以从stringr使用str_extract

          library(stringr)
          
          str_extract(test, "\\w+\\.\\d")
          

          str_replace_allstringr-相当于gsub):

          str_replace_all(test, "[.](.+)[.]", "\\1")
          
          # [1] "name.1" "name.2" "name.3"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-06
            • 2020-11-24
            • 1970-01-01
            • 1970-01-01
            • 2013-02-10
            • 2014-08-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多