【问题标题】:How to remove last n characters from every element in the R vector如何从 R 向量中的每个元素中删除最后 n 个字符
【发布时间】:2014-06-18 06:19:56
【问题描述】:

我对 R 很陌生,我在网上找不到一个简单的例子来说明如何从向量(数组?)的每个元素中删除最后 n 个字符

我来自 Java 背景,所以我想做的是遍历 a$data 的每个元素并从每个元素中删除最后 3 个字符。

你会怎么做?

【问题讨论】:

    标签: r string


    【解决方案1】:

    这是我会做的一个例子。我希望它是您正在寻找的。​​p>

    char_array = c("foo_bar","bar_foo","apple","beer")
    a = data.frame("data"=char_array,"data2"=1:4)
    a$data = substr(a$data,1,nchar(a$data)-3)
    

    a 现在应该包含:

      data data2
    1 foo_ 1
    2 bar_ 2
    3   ap 3
    4    b 4
    

    【讨论】:

    • 有趣的是,我必须将-3 更改为-0 才能获得预期的效果!我有很多日期数据,例如:"2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST" - 是的,两个时区在一起,并且 as.Date 函数返回意外结果(BST 日期提前一天) - 因此我想删除时区戳,结果我必须做-0 它消失了,还有几个小时
    • 还要考虑 strptime 函数,不过我之前没有使用过时区。我想它可能会认出它。据说“%Z”可以识别时区。我还删除了 sapply 功能。我忘了 R 有多喜欢向量化它的函数。
    • @LucasSeveryn 如果要将字符时间表示转换为考虑时区的日期,请将其编辑到您的问题中。可能有更好的答案可以让您直接获得所需的结果(例如strptime)。
    【解决方案2】:

    这是gsub的一种方式:

    cs <- c("foo_bar","bar_foo","apple","beer")
    gsub('.{3}$', '', cs)
    # [1] "foo_" "bar_" "ap"   "b"
    

    【讨论】:

    • (+1) 正则表达式的忠实粉丝。它几乎可以用在所有东西上。
    • 注意:如果它长于要剪切的字符数,则返回原始字符串。考虑gsub('.{5}$', '', 'abcd')
    【解决方案3】:

    虽然这与@nfmcclure 的答案基本相同,但我更喜欢使用stringr 包,因为它提供了一组函数,其名称比基本 R 中的函数最一致和最具描述性(事实上,我总是在谷歌搜索 “如何获取 R 中的字符数” 因为我记不起名字 nchar())。

    library(stringr)
    str_sub(iris$Species, end=-4)
    #or 
    str_sub(iris$Species, 1, str_length(iris$Species)-3)
    

    这会删除Species 列中每个值的最后 3 个字符。

    【讨论】:

      【解决方案4】:

      stringi 包也可以达到同样的效果:

      library('stringi')
      char_array <- c("foo_bar","bar_foo","apple","beer")
      a <- data.frame("data"=char_array, "data2"=1:4)
      (a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
      ## [1] "foo_" "bar_" "ap"   "b" 
      

      【讨论】:

        【解决方案5】:

        类似于@Matthew_Plourde 使用gsub

        但是,如果原始字符串比要剪切的字符数短,则使用将修剪为零字符的模式返回“”:

        cs <- c("foo_bar","bar_foo","apple","beer","so","a")
        gsub('.{0,3}$', '', cs)
        # [1] "foo_" "bar_" "ap"   "b"    ""    ""
        

        不同之处在于,{0,3} 量词表示 0 到 3 个匹配项,而 {3} 需要正好 3 个匹配项,否则找不到匹配项,在这种情况下,gsub 返回未修改的原始字符串。

        注意使用{,3} 将等同于{0,3},我只是更喜欢后一种表示法。

        有关正则表达式量词的更多信息,请参见此处: https://www.regular-expressions.info/refrepeat.html

        【讨论】:

        • 你可以用sub()代替gsub()
        【解决方案6】:

        使用字符串的 n 个字符进行截断/替换时的友好提示:

        -->注意字符串中的空格!

        使用base::gsub(' ', '', x, fixed = TRUE) 去除字符串中不需要的空格。我花了很多时间来找出为什么上面提供的出色解决方案对我不起作用。认为它可能对其他人也有用;)

        【讨论】:

          猜你喜欢
          • 2011-07-14
          • 2011-04-14
          • 1970-01-01
          • 2017-08-31
          • 2018-12-03
          • 1970-01-01
          • 2020-04-06
          • 2015-02-23
          • 1970-01-01
          相关资源
          最近更新 更多