2016-06-13 2 views
2

작성한 목록에서 요소가 들어오는 벡터를 결정하려고합니다.목록의 벡터 위치 반환

set.seed(101) 
a <- runif(10, min=0, max=100) 
b <- runif(10, min=0, max=100) 
c <- runif(10, min=0, max=100) 
d <- runif(10, min=0, max=100) 

information <- list(a, b, c, d) 

information.wanted <- mean(do.call(pmax, information)) 

코드가 information.wanted 작품을 잘 얻을 : 여기 반복 예를 들어주지. 내가 지금 찾고자하는 것은 최대 값 각각이 나오는 목록의 개별 벡터입니다. 예를 들어, information.wanted (87.97 ...)의 값 1은 정보 목록의 벡터 b에서옵니다. 나는 정보를 원한 벡터를 제공하는 다른 코드를 만들고 싶다.

> information.wanted 
[1] 87.97957 95.68375 73.19726 93.16344 92.33189 91.34787 82.04361 81.42830 62.20120 
[10] 92.48044 

어떻게해야할지 모르겠다. 시도한 코드 중 어느 것도 나에게 가까이 접근하지 못했습니다.

postition.of.information.wanted <- ?? 

나는 이런 식으로보고 있습니다. 숫자 벡터가 좋습니다. 나중에 값을 보완 할 수 있습니다.

> position.of.informaiton.wanted 
[1] 2 3 ... 

모든 도움을 주시면 감사하겠습니다. 감사.

+0

모두 고유 한 값입니까? – jalapic

+0

'apply (do.call (rbind, information), 2, which.max)'시도 가능합니다. 아마도 –

+0

일 필요는 없습니다. 모든 값이 고유하다고 가정하면 더 쉬운 해결책이 될 수 있습니다. 데이터 세트는 큰 수치 시뮬레이션입니다 - 목록에는 10,000 개의 요소가있는 13 개의 벡터가 포함되어 있으므로 서로 다른 위치에 중복 될 가능성이 있습니다 – MJH

답변

3

당신은 "정보"의 각 요소마다 "I"인덱스에 which.max을 적용해야합니다

f1 = function(x) 
    sapply(seq_along(x[[1]]), function(i) which.max(sapply(x, "[[", i))) 
f1(information) 
# [1] 2 3 2 2 3 4 2 4 1 4 

mapply 이미 "병렬"기능의 종류 제공 :

f2 = function(x) 
    unlist(.mapply(function(...) which.max(c(...)), x, NULL)) 
f2(information) 
# [1] 2 3 2 2 3 4 2 4 1 4 

또는를, 청크에서 "정보"를 연결하는 대신 "행렬"로 변환하십시오. 시작 부분에 David Arenburg가 주석에 기록하고 applywhich.max 행에 :

f3a = function(x) 
    apply(do.call(cbind, x), 1, which.max) 
f3a(information) 
# [1] 2 3 2 2 3 4 2 4 1 4 

또는 열 : 또한

f3b = function(x) 
    apply(do.call(rbind, x), 2, which.max) 
f3b(information) 
# [1] 2 3 2 2 3 4 2 4 1 4 

max.col는 "매트릭스"에 대한 편리합니다 : 그것은 다음 R, 각 요소에 대한 간단한 루프 인 경우

f4 = function(x) 
    max.col(do.call(cbind, x), "first") 
f4(information) 
# [1] 2 3 2 2 3 4 2 4 1 4 

which.maxmax을 모두 제공하지만 R도 벡터를 처리합니다.

f5 = function(x) 
{ 
    ans = rep_len(1L, length(x[[1]])) 
    maxs = x[[1]] 
    for(i in 2:length(x)) { 
     wh = x[[i]] > maxs 
     maxs[wh] = x[[i]][wh] 
     ans[wh] = i 
    } 
    ans #or '(data.frame(i = ans, val = maxs)' for both 
} 
f5(information) 
# [1] 2 3 2 2 3 4 2 4 1 4 

벤치 마크로 끝내야합니다.

set.seed(007) 
dat = replicate(13, runif(1e4), FALSE) 

identical(f1(dat), f2(dat)) 
#[1] TRUE 
identical(f2(dat), f3a(dat)) 
#[1] TRUE 
identical(f3a(dat), f3b(dat)) 
#[1] TRUE 
identical(f3b(dat), f4(dat)) 
#[1] TRUE 
identical(f4(dat), f5(dat)) 
#[1] TRUE 

microbenchmark::microbenchmark(f1(dat), f2(dat), f3a(dat), f3b(dat), f4(dat), f5(dat), do.call(pmax, dat), times = 50) 
#Unit: microseconds 
#    expr  min   lq  mean  median   uq  max neval cld 
#   f1(dat) 274995.963 298662.210 339279.948 318937.172 350822.539 723673.972 50 d 
#   f2(dat) 94619.397 100079.205 114664.776 107479.127 114619.439 226733.260 50 c 
#   f3a(dat) 19767.925 23423.688 26382.919 25795.499 29215.839 40100.656 50 b 
#   f3b(dat) 20351.872 22829.997 28889.845 25090.446 30503.100 140311.058 50 b 
#   f4(dat) 975.102 1109.431 1546.571 1169.462 1361.733 8954.100 50 a 
#   f5(dat) 2427.665 2470.816 5299.386 2520.755 3197.793 112986.612 50 a 
# do.call(pmax, dat) 1477.618 1530.166 1627.934 1551.046 1602.898 2814.295 50 a 
+0

심층 답변과 벤치 마크를 추가해 주셔서 감사합니다. 매우 도움이된다! – MJH