R paste: игнорировать sep, если аргумент является пустой строкой - PullRequest
4 голосов
/ 16 февраля 2012

Я пытаюсь paste объединить строки адресов в одну строку адресов. Однако некоторые строки пустые (""), и это означает, что добавляется дополнительная 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"

Обратите внимание на дополнительные , во втором адресе. Есть ли способ обойти это, не затрагивая периоды, вызванные регулярным выражением?

Ответы [ 4 ]

7 голосов
/ 16 февраля 2012

Я не думаю, что вы можете избежать небольшого количества регулярных выражений.

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

(регулярное выражение говорит: замените более одного "запятой" одним "запятой")

3 голосов
/ 16 февраля 2012

Это можно сделать в одной строке, без регулярных выражений, но вам нужно ввести цикл (в данном случае через apply).

apply(
  addr.df, 
  1, 
  function(row) paste(row[nzchar(row)], collapse = ", ")
)
1 голос
/ 16 февраля 2012
streets <- ifelse(street2=="",street1,paste(street1,street2,sep=", "))

Затем просто используйте streets вместо street1 и street2 во всей вставке фрейма данных.

0 голосов
/ 16 февраля 2012

Я бы пропустил регулярное выражение и использовал несколько простых условий «если», чтобы проверить количество элементов в вашем фрейме данных.

Задержитесь на минуту: вы действительно хотите, чтобы результат был
22B, Baker, London, а не 22B Baker, London (без запятой между номером и улицей)?Предполагая, что последний является желаемым форматом, просто выполните
allstreet<-paste(street1,street2,sep=" ")

, а затем запустите строку with на allstreet и city.
Вероятно, есть гораздо более приятный способсделать это с plyr или melt: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...