代码之家  ›  专栏  ›  技术社区  ›  YoB

使用带图案的gsub和x作为向量[重复]

  •  1
  • YoB  · 技术社区  · 6 年前

    我面临这个问题,让我们 db data.table 对象定义如下:

                  X    Y
    1:     Joe Snow  Joe
    2: Sony Ericson Sony
    3:    JP Morgan   JP
    4:     KATAKURI   NA
    

    然后我想删除 Y 从…起 X ,如下所示:

    db[!is.na(Y), Z := sub(pattern = Y, replacement = "", x = X)]
    

    正如你所想象的那样,它不起作用,因为 sub 仅接受单个字符作为 pattern . 我尝试了这个技巧,但没有成功:

    db[, pos := 1]
    db[!is.na(Y), Z := sub(pattern = Y, replacement = "", x = X), by = .(pos)]
    

    你有什么解决办法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   akrun    6 年前

    如果我们在 sub 然后 Map 可以使用

    db[!is.na(Y), Z := unlist(Map(sub, pattern = Y, X, replacement = ""))]
    db
    #             X    Y        Z
    #1:     Joe Snow  Joe     Snow
    #2: Sony Ericson Sony  Ericson
    #3:    JP Morgan   JP   Morgan
    #4:     KATAKURI   NA       NA
    

    或者另一种选择是 map/pmap 功能来自 purrr

    library(purrr)
    library(dplyr)
    db %>%
       set_names(c('x', 'pattern')) %>% 
       pmap_chr(., sub, replacement = '') %>% 
       trimws %>%
       bind_cols(db, z = .)
    #              X    Y       z
    #1:     Joe Snow  Joe    Snow
    #2: Sony Ericson Sony Ericson
    #3:    JP Morgan   JP  Morgan
    #4:     KATAKURI   NA      NA