2012-02-16 60 views
3

我试图将paste地址线连接到单个地址字符串。但是,有些行是空白的(""),这意味着额外的sep被插入,并使地址看起来很丑。例如:R粘贴:忽略sep如果参数是一个空字符串

addr.df <- data.frame(street1=c("22B","Windsor Castle"),street2=c("Baker Street",""),city=c("London","Windsor")) 

with(addr.df,paste(street1,street2,city,sep=", ")) 
[1] "22B, Baker Street, London" "Windsor Castle, , Windsor" 

注意第二个地址中的额外,。有没有一种方法可以避免一段时间的正则表达式导致的输出?

+0

也许试试'ifelse'? – 2012-02-16 17:50:23

回答

6

我不认为你可以避免一点正则表达式。

gsub('(,)+',', ',with(addr.df,paste(street1,street2,city,sep=", "))) 

(正则表达式的说:有一个“逗号分隔”替换多个“逗号分隔”)

+0

谢谢贾斯汀。正则表达式并没有我想象的那么复杂,也没有像我预期的那样增加计算时间。 – James 2012-02-16 17:16:44

+0

很乐意提供帮助。我感到你的正则表达式痛苦! – Justin 2012-02-16 17:19:36

+0

太棒了!如果'street1'为空,这不起作用,但字符串将以“逗号空格”开头 – 2017-05-31 13:00:02

0

我会跳过的正则表达式,并使用一些简单的“如果”条件,以检查数据框中元素的数量。

举行了一会儿:你真正想要的输出为
22B, Baker, London而不是22B Baker, London(没有逗号号码和街道之间)?假设后者所需的格式,只是做
allstreet<-paste(street1,street2,sep=" ")

,然后allstreetcity运行with线。
有可能与plyrmelt :-)这样做更巧妙方式

+0

谢谢,但实际问题有更多地址字段,并且此构造可能会变得有点笨拙。 – James 2012-02-16 19:08:16

1
streets <- ifelse(street2=="",street1,paste(street1,street2,sep=", ")) 

然后,只需在您的整个数据帧粘贴使用streets代替street1street2

+0

谢谢,但实际的问题有更多的地址字段,这个构造可能会变得有点笨拙。 – James 2012-02-16 19:07:19

3

它可以在一行中完成,没有任何表示,但是您需要引入循环(通过apply,在这种情况下)。

apply(
    addr.df, 
    1, 
    function(row) paste(row[nzchar(row)], collapse = ", ") 
) 
+0

谢谢,不知道'nzchar'。看起来相当不错,但我接受的答案更容易适应扩展问题。 – James 2012-02-16 19:06:18