从dataframe(csv)中删除每行末尾位置的特定字符串

时间:2016-02-05 12:05:50

标签: r

我正在尝试清理一组csv格式的数据。将数据加载到R后,我需要替换并从中删除一些字符。以下是一个例子。理想情况下我想

  1. 替换每个结尾处的 St - >街
  2. 如果有 St St。
  3. 我需要删除St并将St.替换为Street。
  4. 我尝试使用此代码

    sub(x = evostreet, pattern = "St.", replacement = " ") and later
    
    gsub(x = evostreet, pattern = "St.", replacement = " ") to remove the St. at the end of each row but this also remove some other occurrences of St and the next character 
    
    
    3   James St.
    
    4   Glover Road St.
    
    5   Jubilee Estate. St.
    
    7   Fed Housing Estate St.
    
    8   River State School St.
    
    9   Brown  State Veterinary Clinic. St.
    
    11  Saw Mill St.
    
    12  Dyke St St.
    
    13  Governor Rd St.
    

4 个答案:

答案 0 :(得分:1)

你不需要在这里使用正则表达式。

sub(x = evostreet, pattern = "St.", replacement = " ", fixed=T)

fixed参数意味着您要替换此确切字符,而不是正则表达式的匹配。

答案 1 :(得分:1)

我看到很多接近的答案,但我没有看到任何解决他所遇到的第二个问题,例如更换圣St。"与" Street&#34 ;;例如," Dyke St St。"

sub,如文档中所述:

  

两个*子函数的不同之处仅在于,sub只替换了第一次出现的模式

所以,只需使用" St \\。"因为模式匹配不正确。

OP需要匹配" St St。"的可能的模式。我进一步假设它甚至可能是#34; St。 ST&#34。或者" St。 ST&#34 ;.

假设OP使用的是简单列表:

x = c("James St.", "Glover Road St.", "Jubilee Estate. St.", 
    "Fed Housing Estate St.", "River State School St St.", 
    "Brown State Vet Clinic. St. St.", "Dyke St St.")`
  

[1]" James St。" " Glover Road St."
  [3]" Jubilee Estate。 ST&#34。 "美联储住房圣。"
  [5]" River State School St St。" "布朗州兽医诊所。 St. St。"   [7]" Dyke St St。"

然后,以下内容将根据要求用" Street"替换上述可能的组合:

y <- sub(x, pattern = "[ St\\.]*$", replacement = " Street")
  

[1]&#34;詹姆斯街&#34; &#34;格洛弗路街&#34;
  [3]&#34; Jubilee Estate Street&#34; &#34;美联储住宅区街&#34;
  [5]&#34; River State School Street&#34; &#34;布朗州兽医诊所街&#34;   [7]&#34; Dyke Street&#34;

修改

要回答以下OP的问题,将的一个子项替换为,另一项用街道,我正在寻找一种能够匹配类似表达式以返回不同值的方法,但此时我还没能找到它。我怀疑regmatches可以做到这一点,但这是我以后必须要做的事情。

实现您想要的一个简单方法 - 让我们假设:

x <- c("St. Mary St St.", "River State School St St.", "Dyke St. St")

  

[1]&#34; Saint Mary St St。&#34; &#34; River State School St St。&#34;   [3]&#34; Dyke St. St&#34;

所以你希望x [1]为圣玛丽街,x [2]为 River State School Street ,x [3]为戴克街。我想首先通过将sub()分配给y来解决 Saint 问题,如:

y <- sub(x, pattern = "^St\\.", replacement = "Saint")

  

[1]&#34;圣玛丽街&#34; &#34; River State School Street&#34;   [3]&#34; Dyke Street&#34;

要解析St的结尾,我们可以使用与发布相同的分辨率,除非现在注意我没有使用x作为我的输入向量但不是我刚刚制作的y

y <- sub(y, pattern = "[ St\\.]*$", replacement = " Street")

这应该照顾它。现在,我不知道这是否是最有效的方法。如果你的数据集相当大,这可能会很慢。如果我找到一个更好的解决方案,我会发布它(假如没有其​​他人打败我)。

答案 2 :(得分:0)

我认为你的问题是'。'正则表达式世界中的字符表示“任何单个字符”。所以要在R中字面匹配你应该写

sub(x = evostreet, pattern = "St\\.", replacement = " ")

答案 3 :(得分:0)

您需要&#34;评论&#34;点...否则它意味着St之后的任何事情,这就是为什么文本的其他部分被消除的原因。

sub(x = evostreet, pattern = "St\\.", replacement = " ")

如果要删除文本末尾的标记,最后可以添加$。

sub(x = evostreet, pattern = "St\\.$", replacement = " ")

subgsub之间的区别在于,sub只会处理标记在文本中出现的第一次。如果存在重复,gsub将消除所有内容。在你的情况下,当你在行的末尾寻找模式时,如果你使用$,它应该没有任何区别。