무엇 findInterval
및 tapply
에 대해. findInterval
는 cut
비슷하지만 최대 값
tapply(f(v),findInterval(v,w),max)
# 1 2
# 22.09 144.00
을 원하는 아니면 사실을 사용할 수 있다면 요인
tapply(v,findInterval(v,w),function(x)x[which.max(f(x))])
# 1 2
# 4.7 12.0
또는 다음으로 변환하는 오버 헤드없이 기능은 단조 모든 양의 값을 증가하고 있음 하고. 당신이 경계에서 발생하는 지정해야합니다
f(tapply(v,findInterval(v,w),max))
참고 w`는 3 개 세트 (하나가 비어)를 정의`것을
library(microbenchmark)
microbenchmark(
mnel = tapply(v,findInterval(v,w),max),
flodel = unname(vapply(split(f(v), cut(v, w), drop = TRUE), max, numeric(1L))),
flodel2 = unname(vapply(split(seq_along(v), findInterval(v, w)), function(i, v, fv)v[i][which.max(fv[i])], numeric(1L), v, f(v))))
# Unit: microseconds
# expr min lq median uq max neval
# mnel 260.945 262.9155 264.2265 276.0645 458.670 100
# flodel 331.218 334.3585 336.0580 351.1985 694.715 100
#flodel2 124.998 127.3230 128.5170 137.0505 354.545 100
당신는없고 (도움말 파일을 읽기), 아직 출력은 길이가 2 인 벡터입니까? 오히려, 길이 '3'목록을 산출물로 생각하십니까? – flodel
아니요, 숫자가있는 간격없이 결과 만 필요합니다(). – rose
나를 위해 최적화 된 것 같지만'unlist (list ('sapply'를'vapply'로 대체 할 수 있습니다. 한가지주의 할 점은'f'가 당신이 가진 모든 간격마다 한 번 호출된다는 것입니다.) 이것은 병목 일 수 있습니다. 간격이 더 많이 (그리고 더 작아 질 때)'f'가 코딩되는 방법에 따라 달라집니다. –