2012-02-16 16 views
3

私はpasteのアドレス行を1つのアドレス文字列にしようとしています。しかし、いくつかの行は空白("")であり、これは余分にsepが挿入され、アドレスが醜いことを意味します。たとえば:R貼り付け:引数が空文字列の場合は無視する

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" 

は、第2のアドレスに余分な,に注意してください。 regexpに誘​​発されたtourettesの期間を伴わないこれのまわりの方法がありますか?

+0

おそらく 'ifelse'を試してみませんか? –

答えて

6

私はあなたが少し正規表現を避けることはできないと思います。

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

(正規表現は言う:シングル「コンマスペース」で複数の「コンマスペース」を置き換える)

+0

Justinに感謝します。正規表現は私が期待したほど複雑ではなく、予想したほどの計算時間を追加しませんでした。 – James

+0

お手伝いします。私はあなたの正規表現の痛みを感じる! – Justin

+0

素晴らしい!これは 'street1'が空であれば動作しません。文字列は"カンマスペース "で始まります。 –

0

条件をチェックするために、「あれば」私は正規表現をスキップして、いくつかの簡単なを使用したいですデータフレーム内の要素の数。

は一瞬のためにそれをホールド:あなたは本当に、出力は(数とストリートの間にはカンマ)22B Baker, Londonとは対照的に、
22B, Baker, Londonになりたいですか?ただ
allstreet<-paste(street1,street2,sep=" ")

を行い、その後、allstreetcityであなたのwithラインを実行し、後者は目的のフォーマットであると仮定すると。
それからちょうどあなたの全体のデータフレームのペーストに代わりstreet1street2streetsを使用

+0

実際の問題はアドレスフィールドの数が増え、この構造体はやや扱いにくくなります。 – James

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

:-) plyrまたはmeltでこれを行うために多くのスリッカー方法はおそらくあります。

+0

ありがとうございますが、実際の問題はより多くのアドレスフィールドを持ち、この構造体はやや扱いにくくなります。 – James

3

これは1行で行うことができますが、正規表現はありませんが、ループを導入する必要があります(この場合はapplyを使用します)。

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

ありがとう、 'nzchar'について知りませんでした。かなり良いように見えますが、私が受け入れた答えは、拡張された問題に少しはやりやすくなりました。 – James

関連する問題