두 벡터가 있다고 가정합니다. 하나는 관심있는 모든 값과 가능한 모든 값을 포함 할 수있는 하나의 샘플 벡터를 포함하는 참조 벡터/목록입니다. 지금은 벡터 내부의 비교 값의 특정 고정되지 관용과 depentent의 참조 목록 안에 내 샘플의 일치를 찾으려면 :허용 오차 (매우 빠르지 만 작업 공간 절약)가있는 두 개의 매우 큰 벡터를 일치 시키십시오.
matches: abs(((referencelist - sample[i])/sample[i])*10^6)) < 0.5
두 벡터를 반올림있는 옵션입니다! 예를 들어
고려 :referencelist <- read.table(header=TRUE, text="value name
154.00312 A
154.07685 B
154.21452 C
154.49545 D
156.77310 E
156.83991 F
159.02992 G
159.65553 H
159.93843 I")
sample <- c(154.00315, 159.02991, 154.07688, 156.77312)
그래서 난 결과를 얻을 :
name value reference
1 A 154.00315 154.00312
2 G 159.02991 159.02992
3 B 154.07688 154.07685
4 E 156.77312 156.77310
나는 예를 들어, 사용 할 수있는 일
myDist <- outer(referencelist, sample, FUN=function(x, y) abs(((x - y)/y)*10^6))
matches <- which(myDist < 0.5, arr.ind=TRUE)
data.frame(name = referencelist$name[matches[, 1]], value=sample[matches[, 2]])
과 같은 외부 함수 또는 for()
루프를 사용할 수 있습니다.
하지만 내 특별한 문제는 약 1 * 10^12 엔트리의 참조 벡터와 1 * 10^7 주위의 샘플 벡터입니다. 그래서 outer()를 사용하여 모든 작업 공간 제한을 쉽게 파기하고 for()
또는 연결 for()
루프를 사용하여이 작업을 완료하는 데 일/주가 소요될 것입니다.
누구나 R에서이 작업을 빠르게 수행하는 방법에 대한 아이디어가 있지만 여전히 정확하지만 최대 컴퓨터를 사용하고 있습니다. 64 GB RAM?
도움 주셔서 감사합니다.
최저 whishes data.table
를 사용
참조 벡터가 정렬 되었습니까? 그렇다면 가장 가까운 숫자를 찾기 위해 이분법을 사용할 수 있습니다. 그렇지 않다면 - 그것을 정렬하십시오! 또한 어떻게 저장됩니까? RAM에 너무 큽니다. 단일 파일입니까 아니면 여러 파일에 걸쳐 있습니까? –
사용자가 지정한 예제에서 모든 값은 좁은 범위 (154, 160)로 표시됩니다. '(x-y)/y' 대신'(x-y)/154'를 계산함으로써 문제를 단순화 할 수 있습니까? –
@john Coleman : 예. 오름차순으로 정렬됩니다. 이분법이란 무엇입니까? 전에는 들리지 않았고, 나는 아프다. 참조 벡터가 내 RAM에 들어가면 약 64GB의 여유 공간이 있습니다. – JmO