2012-02-16 58 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