【问题标题】:String processing in R (find and replace)R中的字符串处理(查找和替换)
【发布时间】:2014-11-19 08:29:00
【问题描述】:

这是我data.frame的一个例子

no string
1  abc&URL_drf
2  abcdef&URL_efg

我需要将单词*&URL 替换为""。所以,我需要一个这样的结果

no string
1 _drf
2 _efg

如果是 Excel,我可以在“查找和替换”功能中使用 '*&URL' 轻松得出此结果。 但是,我无法在 R 中寻找有效的方法。

在 R 中,我的方法如下。

首先,我使用strsplit(df$string, "&URL") 拆分字符串,然后选择了第二列。我认为这不是一个有效的方法。

有什么有效的方法吗?

【问题讨论】:

  • 我不能准确地告诉你 R,但如果这种语言提供正则表达式函数,你可以使用 [0-9]+\s+(.+&URL) 并从第 1 组的开始和结束索引中删除内容。
  • 我认为sapply(strsplit(df[[2]], "URL"), "[", 2) 可能很快。你能定义有效吗?
  • @Tyler Rinker/ 我认为有效性是“简单而快速”。你的方法令人印象深刻。感谢您的评论!

标签: r string


【解决方案1】:
# data
df <- read.table(text="no string
1  abc&URL_drf
2  abcdef&URL_efg", header=T, as.is=T)

# `gsub` function is to substitute the unwanted string with nothing, 
# thus the `""`. The pattern of unwanted string was written in 
# regular expressions.

df$string <- gsub("[a-z]+(&URL)", "", df$string)
# you get
  no string
1  1   _drf
2  2   _efg

【讨论】:

  • 使用 [0-9]+\s+(.+&amp;URL) 并删除组 1 也将允许使用 a-z 以外的字符作为前缀。
  • 为什么要建群((&amp;URL))?
  • @SvenHohenstein,我们可以删除(),它会返回相同的结果。只是() 没有危险,而且很容易看到。
【解决方案2】:

我建议你使用grep 函数。

grep 函数将您的正则表达式作为第一个参数,将输入向量作为第二个参数。如果您传递 value=TRUE,则 grep 将返回一个向量,其中包含输入向量中实际元素的副本,该副本可能是(部分) 匹配。

在你的情况下

grep("[a-z]+(&URL)", df$col, perl=TRUE, value=TRUE)

【讨论】:

    【解决方案3】:

    另一种方法:

    df <- transform(df, string = sub(".*&URL", "", string))
    
    #  no string
    # 1  1   _drf
    # 2  2   _efg
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多