두 개의 데이터 세트를 두 개의 기준에 따라 R에 병합하려고합니다. 그들은 같은 이드와 해를 가져야한다. 벡터 중 하나의 크기는 약 10000이고 다른 하나는 2000입니다. 두 단계를 하나씩 검색하면 계산 시간이 폭발 할 것입니다. 데이터는 ID와 연도별로 정렬됩니다. 순진 비교보다 효율적인 검색 알고리즘이 있습니까?더 효율적인 검색 알고리즘이 있습니까
답변
이 문제에 대한 해결책은 여러 가지가 있습니다. 병합, 색인 작성, 반복 (자네가 말했듯이).
그러나 가장 좋은 해결책은 data.table
패키지를 사용하는 것입니다.이 패키지는 데이터 세트를 관리하기위한 속도가 매우 빠르며 진화 된 버전 data.frame
으로 간주 될 수 있습니다.
먼저 데이터를 설정해 보겠습니다. 질문에서 제공 한 제한된 정보를 바탕으로 다음은 문제를 해결하기위한 시도입니다.
install.packages("data.table")
library(data.table)
set.seed(100)
dt1 <- data.table(
id = 1:10000,
Year = sample(1950:2014,size=10000,replace = TRUE),
v1 = runif(10000)
)
head(dt1)
dt2 <- data.table(
id = sample(1:10000,2000),
Year = sample(1950:2014,size=2000,replace = TRUE),
v2 = runif(2000),
v3 = runif(2000)
)
head(dt2)
일단 데이터가 설정되면 나머지 부분은 매우 간단합니다.
1 단계 : 키를 설정하십시오.
setkey(dt1,id,Year) # Set keys in first table
setkey(dt2,id,Year) # Set keys in second table
2 단계 : 원하는대로 병합하십시오.
dt1[dt2,nomatch=0]
dt2[dt1,nomatch=0]
데이터를 병합하는 데 걸린 시간은 약 0.02 초입니다. 이것은 매우 큰 데이터 세트에서도 매우 빠르게 작동합니다.
system.time(dt1[dt2,nomatch=0]) # 0.02 sec
system.time(dt2[dt1,nomatch=0]) # 0.02 sec
이 도움이
?example(data.table)
data.table 희망에 대한 자세한 내용을 보려면!
그렇지 않은 경우 자세한 정보를 게시하십시오!
data.table 패키지를 언급 해 주셔서 감사합니다. data.frame helpfu에 대한 소개입니다. 분명히 data.table은 벡터 스캔 대신 이진 검색을 사용합니다. 그래서 훨씬 빠릅니다. [link] (http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf) –
정확합니다. 다른 두 가지 좋은 읽기도 있습니다. 시도 : 'vignette ("datatable-faq") 및 'vignette ("datatable-timing")' – Shambho
@YanSong, [이 답변] (http://stackoverflow.com/a/20057411/559784) 도움이 될 수 있습니다 답변 'data.table'과 바이너리 검색에 관한 몇 가지 질문. – Arun
- 1. gzip보다 효율적인 압축 알고리즘이 있습니까?
- 2. 더 효율적인 방법이 있습니까?
- 3. 알려진 검색 가능한 값의 분포를 이용하는 검색 알고리즘이 있습니까?
- 4. 프로젝트 오일러 # 8 : 무차별 대입 계산보다 효율적인 알고리즘이 있습니까?
- 5. 검색 알고리즘이 필요합니다.
- 6. 검색 알고리즘이 불완전한 입력
- 7. 문자열의 분할 영역에 대해 계산을 수행하는 현명한 효율적인 알고리즘이 있습니까?
- 8. 큰 트리 구조가 주어지면 트리에서 쿼리하거나 필터링하는 효율적인 알고리즘이 있습니까?
- 9. 파일 트리 개체에서 여러 경로를 구문 분석합니다. 효율적인 알고리즘이 있습니까?
- 10. 하스켈에서보다 효율적인 알고리즘 프리폼 더
- 11. 스타 검색 알고리즘이 거의 작동합니다.
- 12. 효율적인 XMPP 사용자 검색
- 13. 더 효율적인 jquery
- 14. 더 효율적인 방법으로이를 수행 할 수 있습니까?
- 15. 배열별로 그룹화하는 좀 더 효율적인 방법이 있습니까?
- 16. 서브 쿼리가 조인보다 더 효율적인 경우가 있습니까?
- 17. /else를 사용하는 경우 더 효율적인 방법이 있습니까?
- 18. 더 효율적인 자원은 무엇입니까?
- 19. 더 효율적인 방법이 있나요
- 20. 더 효율적인 설정은 무엇입니까?
- 21. 더 효율적인 SQL 쿼리
- 22. 더 효율적인 선형 보간?
- 23. 검색 할 대기열 알고리즘이 표시되지 않습니다.
- 24. 그래프 외곽선을 생성하는 알고리즘이 있습니까?
- 25. 더 효율적인 선택
- 26. Java보다 효율적인 배열 검색
- 27. 더 효율적인 DataTable 정렬
- 28. 더 효율적인 자바 스크립트
- 29. 더 효율적인 방법이 있나요?
- 30. 더 효율적인 스크립트?
데이터가 정렬 되었습니까? – Fernando
예. 이드와 연도별로 정렬됩니다. 나는 그 질문을 편집했다. –
10k와 2k는 컴퓨터의 상대적으로 작은 숫자입니다. 그래서, 여기에 '폭발하다'는 의미는 ... 1ms 또는 무언가 (극도의 친척이긴하지만 내 점수를 얻는다)? 정렬 되었기 때문에 일치하지 않을 때 건너 뛸 수 있습니다. – keyser