【问题标题】:Removing prefix from strings in R data frame从 R 数据框中的字符串中删除前缀
【发布时间】:2021-10-05 22:52:01
【问题描述】:

我有一个数据框,wkt_small,其中包含以下数据:

id             GEOMETRY                                                                                      
  <chr>          <chr>                                                                                         
1 PTK01        LINESTRING( 1.142 85.892 1.400, 0.991 85.892 1.400)
2 PTK02        LINESTRING( 2.142 85.892 1.400, 0.991 85.892 1.400)
...

我需要的是它看起来像这样:

id             GEOMETRY                                                                                      
  <chr>          <chr>                                                                                         
1 PTK01        ( 1.142 85.892 1.400, 0.991 85.892 1.400)
2 PTK02        ( 2.142 85.892 1.400, 0.991 85.892 1.400)
...

我尝试了以下方法:

wkt_small[, 2] <- gsub('^\\w+', '', wkt_small[, 2])

然而,这为我提供了所有行的 GEOMETRY 的以下值:

("LINESTRING( 1.142 85.892 1.400, 0.991 85.892 1.400, 0.991 85.301 1.4)","LINESTRING( 1.142 85.892 1.400, 0.991 85.892 1.400, 0.991 85.301 1.4)"...

将第一行值与我想为数据框中的所有条目删除的字符串连接起来。

【问题讨论】:

    标签: r regex dataframe


    【解决方案1】:

    更新: 我们可以使用str_remove(在这种情况下更好):

    library(stringr)
    wkt_small %>% 
        mutate(GEOMETRY = str_remove(GEOMETRY, '^\\w+'))
    

    我们可以使用stringr包中的str_replace和正则表达式"^[A-Z]*"

    library(dplyr)
    library(stringr)
    df %>% 
        mutate(GEOMETRY = str_replace(GEOMETRY, "^[A-Z]*", ""))
    

    输出:

      id    GEOMETRY                                 
      <chr> <chr>                                    
    1 PTK01 ( 1.142 85.892 1.400, 0.991 85.892 1.400)
    2 PTK02 ( 2.142 85.892 1.400, 0.991 85.892 1.400)
    
    

    【讨论】:

      【解决方案2】:

      使用[[…]] 或$… 选择单个列,而不是[, …]:

      wkt_small$GEOMETRY <- sub('^\\w+', '', wkt_small$GEOMETRY)
      

      ...实际上,使用正确的data.frame,您的代码也可以正常工作;但是对于 tibble,[ 索引总是返回一个 tibble,而不是列向量。 tibble 语义等同于将[, …, drop = FALSE] 与常规data.frame 一起使用。

      【讨论】:

      • 在这种情况下,我宁愿建议使用sub 而不是gsub,因为整个字符串只有一部分被替换
      • @Onyambu 是的,我非常同意(并且通常会留下这样的 cmets ;-))。
      • @Konrad Rudolph 哪个正则表达式更好:gsub('^\\w+', '', wkt_small$GEOMETRY) 与 gsub("^.*?\\(","\\(", wkt_small$GEOMETRY)?谢谢。
      • @TarJae 取决于您想要匹配的内容。但总的来说,我更喜欢尽可能具体。所以也许"^\\w+\\("。无论如何,请注意上面的评论并使用sub 而不是gsub。
      猜你喜欢
      • 2011-05-08
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      相关资源
      最近更新 更多