2016-07-15 6 views
1

다음 R 코드를 더 빠르게 수행하는 일반적인 방법은 무엇입니까? 예를 들어 python dict comprehension (아래의 해당 내용 참조)에서 더 빠른 대안이 될 수 있습니다.사전 및 목록 이해 R

R :

l1 <- 1:3 
l2 <- c("a", "b", "c") 
foo <- function(x) {return(5*x)} 
bar <- list() 
for (i in 1:length(l1)) bar[l2[i]] <- foo(l1[i]) 

파이썬

l1 = range(1, 4) 
l2 = ["a", "b", "c"] 
def foo(x): 
    return 5*x 
{b: foo(a) for a, b in zip(l1, l2)} 
+4

'setNames (lapply (l1, foo), l2)'. – joran

+1

리스트가 필요없는 경우 (요소 당 하나의 숫자이기 때문에),'lapply' 대신'sapply'를 사용할 수 있습니다. – Frank

+1

곱셈 (따라서'foo')이 벡터화되었으므로'as.list (setNames (l1 * 5, l2))'또는'as.list (setNames (f1 (l1), l2))'; 'as.list'를 삭제하여 명명 된 숫자 벡터로 유지합니다. – alistaire

답변

3

우리는 속도에 대해 이야기, 그래서 일부 벤치마킹 할 수 있도록하고 있습니다 :

library(microbenchmark) 
microbenchmark(op = {for (i in 1:length(l1)) bar[l2[i]] <- foo(l1[i])}, 
       lapply = setNames(lapply(l1,foo),l2), 
       vectorised = setNames(as.list(foo(l1)), l2)) 

Unit: microseconds 
     expr min lq  mean median  uq max neval 
     op 7.982 9.122 10.81052 9.693 10.548 36.206 100 
    lapply 5.987 6.557 7.73159 6.842 7.270 55.877 100 
vectorised 4.561 5.132 6.72526 5.417 5.987 80.964 100 

그러나 이러한 작은 값은 큰 의미가 없습니다를 그래서 저는 벡터 길이를 10,000으로 올리면서 실제로 차이를 볼 것입니다 :

l <- 10000 
l1 <- seq_len(l) 
l2 <- sample(letters, l, replace = TRUE) 

microbenchmark(op = {bar <- list(); for (i in 1:length(l1)) bar[l2[i]] <- foo(l1[i])}, 
       lapply = setNames(lapply(l1,foo),l2), 
       vectorised = setNames(as.list(foo(l1)), l2), 
       times = 100) 

Unit: microseconds 
     expr  min  lq  mean  median  uq  max neval 
     op 30122.865 33325.788 34914.8339 34769.8825 36721.428 41515.405 100 
    lapply 13526.397 14446.078 15217.5309 14829.2320 15351.933 19241.767 100 
vectorised 199.559 259.997 349.0544 296.9155 368.614 3189.523 100 

하지만 다른 사람들이 말한 것에 덧붙여서, 그것은 목록 일 필요는 없습니다. 목록 요구 사항을 제거한 경우 :

microbenchmark(setNames(foo(l1), l2)) 

Unit: microseconds 
        expr min  lq  mean median  uq  max neval 
setNames(foo(l1), l2) 22.522 23.8045 58.06888 25.0875 48.322 1427.417 100 
+0

/존경심 및/thanks @ sebastian-c –