당신은 "정보"의 각 요소마다 "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가 주석에 기록하고 apply
which.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.max
과 max
을 모두 제공하지만 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
모두 고유 한 값입니까? – jalapic
'apply (do.call (rbind, information), 2, which.max)'시도 가능합니다. 아마도 –
일 필요는 없습니다. 모든 값이 고유하다고 가정하면 더 쉬운 해결책이 될 수 있습니다. 데이터 세트는 큰 수치 시뮬레이션입니다 - 목록에는 10,000 개의 요소가있는 13 개의 벡터가 포함되어 있으므로 서로 다른 위치에 중복 될 가능성이 있습니다 – MJH