【问题标题】:Row-Wise Pattern Replace with Replacement Value Coming from Another Column [duplicate]用来自另一列的替换值进行逐行模式替换[重复]
【发布时间】:2019-12-06 07:46:25
【问题描述】:

我的数据是这样的:

Item | Process
ABC  | XYZ-ABC
AC   | XYZ-AC
AD   | XYZ-AD
AEM  | XYZ-AEM
AF   | XYZ-AF
AG   | WXY-AG
AHSG | WXY-AHSG
AI   | WXY-AI
AJ   | WXY-AJ

Process 列以特定字符串开头,Item 列中的值附加到该字符串。只应保留起始字符串。 Item 列中的值及其长度可能会有所不同。我想做一个逐行的gsub(),其中模式是Item 中的值,替换是''(空白),目标是Process 列。

我不能只删除Process 中“-”之后的所有内容,因为分隔符可以更改。我不在乎分隔符是否被留下,只要其余的被删除即可。此外,Process 中的起始字符串的长度可能会有所不同。

这是我迄今为止使用data.table 尝试过的:

myData[grep(Item, Process), gsub(Item, "", Process)]

这适用于第一行,但所有其余行保持不变。我知道这是因为gsub() 只能采用一种模式,而我提供了多种模式。我正在寻找一种非常有效和快速的方法来实现这一目标。我的数据可以有 > 400 万行。这将在 Shiny 应用程序中发生,我不想让用户在发生这种情况时等待。请帮忙!

【问题讨论】:

    标签: r string replace gsub


    【解决方案1】:

    如果您想以逐行方式执行此操作,您可以使用stringr 中的str_replace,它在stringpattern 上进行矢量化

    stringr::str_replace(df$Process, df$Item, "")
    #[1] "XYZ-" "XYZ-" "XYZ-" "XYZ-" "XYZ-" "WXY-" "WXY-" "WXY-" "WXY-"
    

    或者str_remove,它是str_replace(string, pattern, "")的别名

    stringr::str_remove(df$Process, df$Item)
    

    数据

    df <- structure(list(Item = c("ABC", "AC", "AD", "AEM", "AF", "AG", 
    "AHSG", "AI", "AJ"), Process = c("XYZ-ABC", "XYZ-AC", "XYZ-AD", 
    "XYZ-AEM", "XYZ-AF", "WXY-AG", "WXY-AHSG", "WXY-AI", "WXY-AJ"
    )), class = "data.frame", row.names = c(NA, -9L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2023-03-14
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多