2013-07-24 3 views
10

이것은 단순한 R 질문입니다. 여기에 정확한 대답은 나와 있지 않습니다. 다음과 같은 데이터 프레임 (alldata)이 있습니다.R 데이터 프레임에 값을 삽입하기위한 간단한 검색

Case  zip  market 
1  44485 0 
2  44481 0 
0 

350 만 개가 넘는 레코드가 있습니다.

그런 다음 두 번째 데이터 프레임 인 'zipcode'가 있습니다.

market zip 
1   44485 
1   44486 
1   44488 
...  ... (100 zips in market 1) 

2   43211 
...  ... (100 zips in market 2, etc.) 

는 I는 우편 번호 데이터 프레임에 해당하는 값과 일치 ALLDATA $으로 우편에 기초하여 각각의 경우에 대해 ALLDATA $으로 시장에 대한 정확한 값을 반환 할. 나는 단지 올바른 구문을 찾고있을 뿐이며 평소와 같이 도움을 많이받습니다. merge 사용하면 alldatamarket 열 걱정하지 않기 때문에

+0

. '[r] merge'를 검색하면 –

+0

@Ricardo Saporta가 3.5에서'merge'가 약간 느려질 수 있습니다. –

+0

@TylerRinker, 나는 자주 400 만 줄에'merge.data.table'을 사용합니다. 그래도'qdap'을 사용하는 것이 좋습니다. –

답변

12

먼저 사용하여 벗겨 수 alldatazip 열을 기반으로 zipcodes의 열을 병합 :

merge(alldata[, c("Case", "zip")], zipcodes, by="zip") 

by 매개 변수를 키 기준을 지정하므로 복합 키가있는 경우 by=c("zip", "otherfield")과 같은 작업을 수행 할 수 있습니다.

+0

alldata에없는 zip 코드에 대해 NAs가 도입되지 않습니까? – Rodrigo

+0

@Rodrigo 기본적으로 두 데이터 프레임에서 일치하는 행만 표시됩니다. 'all','all.x','all.y' 옵션으로 제어 할 수 있습니다. –

3

이렇게 큰 데이터 세트를 사용하면 환경 검색 속도를 원할 수 있습니다.

library(tidyverse) 
alldata %>% 
    select(-market) %>% 
    left_join(zipcodes, by="zip") 

내 컴퓨터에, 대략 다음과 같습니다

library(qdapTools) 
alldata$market <- lookup(alldata$zip, zipcodes[, 2:1]) 

또는

alldata$zip %l% zipcodes[, 2:1] 
+0

Tyler, 좀 더 큰 데이터로 이것을 테스트했고'lookup (.) '단계가 시간이 많이 걸렸습니다. 잠시 후). 나는 그것을 (** gist **) (https://gist.github.com/arunsrinivasan/ee2d9ef43bdc02c32958)로했습니다. 내가 제대로하고 있니? 빠른 디버그로 시간이 많이 걸리는 부분은'recoder' 함수 내부에서'sapply (.) '처럼 보입니다. – Arun

+0

@Arun 요지를 가져 주셔서 감사합니다. 상당한 속도 향상을 가져온 결과를 토대로 [dev 버전] (https://github.com/trinker/qdapTools)에 몇 가지 개선 사항을 추가했습니다. –

+0

그냥 호기심에서 벗어난 방법으로 'data.table'을 벤치마킹 해 보았습니다. 나는'data.table'가 문자 조회를 포함한 조회에서 몇 가지 좋은 점을 보았다는 것을 읽었습니다. –

1

을 여기에 그 일의 dplyr 방법입니다 다음과 같이 당신은 qdapTools package에서 lookup 기능을 사용할 수 있습니다 lookup과 동일한 성능

2

나를 위해 일한 매우 간단하다 또 다른 옵션 : 당신이 merge``를 찾고 있습니다

alldata$market<-with(zipcodes, market[match(alldata$zip, zip)]) 
+0

너무 단순하지만 너무 좋습니다! – vashts85

+0

무슨 일이 일어나고 있는지 설명하면 좋을 것 같습니다. – Rodrigo

관련 문제