2012-02-16 5 views
3

paste 개의 주소 행을 단일 주소 문자열에 연결하려고합니다. 그러나 일부 줄은 비어 있고 ("") 추가 sep이 삽입되어 주소가보기 흉하게 나타납니다.R 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" 

주의 두 번째 주소를 추가 , 예를 들면 다음과 같습니다. regexp 유도 된 tourettes의 기간을 포함하지 않는 이것의 둘레에 방법 있는가?

+0

'ifelse'을 사용해 보시겠습니까? –

답변

6

나는 약간의 정규식을 피할 수 있다고 생각하지 않는다.

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

은 (정규식은 말한다 : 하나의 "쉼표 공간"더 이상 "쉼표 공간"대체) 내가 정규식을 생략하고 확인하기 위해 몇 가지 간단한 "만약"조건을 사용하십시오

+0

감사합니다 저스틴. 정규식은 내가 기대했던 것만 큼 복잡한 것은 아니었고 예상 한만큼 계산 시간을 추가하지도 못했습니다. 도움이된다면 – James

+0

다행입니다. 그리고 나는 당신의 정규식 고통을 느낀다! – Justin

+0

좋아요! 'street1'이 비어 있으면 문자열이 "쉼표 공백"으로 시작됩니다. –

0

데이터 프레임의 요소 수

잠시 그 ​​상태에서 : 당신이 정말로 출력 (수와 거리 사이에 쉼표) 22B Baker, London에 반대
22B, Baker, London 싶은가? 원하는 형식은 그 후자 가정, 단지
allstreet<-paste(street1,street2,sep=" ")

을 그리고 allstreetcitywith 줄을 실행합니다.
아마

+0

고마워요.하지만 실제 문제는 더 많은 수의 주소 필드를 가지고 있으며이 구조는 다소 다루기 힘들어 질 수 있습니다. – James

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

그런 다음 당신의 전체 데이터 프레임 페이스트 streets 대신 street1street2를 사용 plyr 또는 melt :-)이 할 수있는 많은 야바위꾼 방법이있다.

+0

감사합니다. 그러나 실제 문제는 더 많은 수의 주소 필드를 가지고 있으며이 구조는 다소 다루기 힘들어 질 수 있습니다. – James

3

정규식없이 한 행에서 수행 할 수 있지만 루핑을 도입해야합니다 (이 경우 apply를 통해).

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

감사합니다.'nzchar'에 대해 몰랐습니다. 아주 좋아 보이지만, 내가 받아 들인 대답은 확장 된 문제에 좀 더 쉽게 들어 맞았다. – James

관련 문제