2016-07-20 2 views
3

중첩 된 lapply에 대한 효율적인 대안을 찾고 있는데 중첩 된 구조를 사용하는 것이 R 커뮤니티에서 인정받지 못한다고 생각합니다. 누구든지 가능한 아이디어를 제안하거나 사용자 정의 함수에서 둥지 lapply 사용을 피하기 위해 접근 할 수 있습니까? R에서 중첩 된 lapply 사용을 피하는 방법은 무엇입니까?

a.big <- a[a$score >10,] 
a.sml <- a[(a$score > 6 & a$score <= 10),] 
a.non <- a[a$score < 6,] 

a_new <- list('big'=a.big, 'sml'=a.sml) 
tar.list <- list(b,c) 

test <- lapply(a_new, function(ele_) { 
    re <- lapply(tar.list, function(li) { 
    out <- base::setdiff(ele_, li) 
    return(out) 
    }) 
}) 

목적 :

피할 데이터 내가 lapply 중첩 있지만이를 방지하려면 사용

a <- data.frame(
    start=seq(1, by=9, len=18), stop=seq(6, by=9, len=18), 
    ID=letters[seq(1:18)], score=sample(1:25, 18, replace = FALSE)) 
b <- data.frame(
    start=seq(2, by=11, len=20), stop=seq(8, by=11, len=20), 
    ID=letters[seq(1:20)], score=sample(1:25, 20, replace = FALSE)) 
c <- data.frame(
    start=seq(4, by=11, len=25), stop=seq(9, by=11, len=25), 
    ID=letters[seq(1:25)], score=sample(1:25, 25, replace = FALSE)) 

기능 시뮬레이션

: 여기

빠른 재현 예입니다 중첩 된 lapply를 사용하여 효율적인 대안을 찾는다. 나는 재현하기 쉽고 빠르며, 빠르고 쉬운 하류 계산을 가능하게해야만하는 출력에 대한 더 나은 표현을 찾는 것을 의미한다. 이것을하기위한 일반적인 접근법이 있습니까?

test에 중첩 된 lapply를 사용하지 않으려면 어떻게해야하나요? 누구든지이 문제를 해결할 수있는 아이디어를 제안 할 수 있습니까? 감사합니다

감사합니다 :

+0

신선한 R 세션에서 예제 코드를 실행하려고 했습니까? 또한 당신은 당신이하려고하는 것을 단지 붙여 넣기 코드와 기술해야한다. – hrbrmstr

+0

@hrbrmstr : 예, 시도했지만, 사용자 정의 함수에서 중첩 된 lapply를 사용하면 예상치 못한 결과가 반환됩니다. 위의 코드는 내 함수의 결과를 기반으로 시뮬레이트됩니다. 큰 data.frame 객체를 다루기 위해 중첩 된 구조를 대체하기위한 일반적인 전략을 모색 중입니다. 이 문제를 피하기위한 일반적인 접근 방법은 무엇입니까? – user88911

+0

@ Jimbou : 목록과 같은 객체를 제외한 모든 가능한 출력을 허용 할 수 있습니다. 대답으로 가능한 접근법을 자세히 설명해 주시겠습니까? – user88911

답변

5

난 당신이 정말 원하는 것을 확실하지 않다. 당신이 두 목록의 모든 조합의 setdiff을 좋아한다면, 당신은이 같은 것을 사용할 수 있습니다 더블 [[]] brakets를 사용

# all combinations 
a <- expand.grid(seq_along(a_new), seq_along(tar.list)) 
a 
    Var1 Var2 
1 1 1 
2 2 1 
3 1 2 
4 2 2 
# apply over all combinations setdiff row-vice 
apply(a, 1, function(x, y, z){ setdiff(y[x[1]], z[x[2]])}, a_new, tar.list)[1:2] 
[[1]] 
[[1]][[1]] 
    start stop ID score 
2  10 15 b 21 
3  19 24 c 12 
6  46 51 f 23 
9  73 78 i 15 
10 82 87 j 19 
11 91 96 k 25 
13 109 114 m 11 
16 136 141 p 17 
17 145 150 q 18 
18 154 159 r 24 


[[2]] 
[[2]][[1]] 
    start stop ID score 
5  37 42 e  9 
14 118 123 n  8 
15 127 132 o  7 

당신에게 하나의 목록 만의 깨끗한 출력을 제공합니다.

apply(a, 1, function(x, y, z){ setdiff(y[[x[1]]],z[[x[2]]])}, a_new, tar.list) 

[[1]] 
    start stop ID score 
2  10 15 b 21 
3  19 24 c 12 
6  46 51 f 23 
9  73 78 i 15 
10 82 87 j 19 
11 91 96 k 25 
13 109 114 m 11 
16 136 141 p 17 
17 145 150 q 18 
18 154 159 r 24 

[[2]] 
    start stop ID score 
5  37 42 e  9 
14 118 123 n  8 
15 127 132 o  7 

[[3]] 
    start stop ID score 
2  10 15 b 21 
3  19 24 c 12 
6  46 51 f 23 
9  73 78 i 15 
10 82 87 j 19 
11 91 96 k 25 
13 109 114 m 11 
16 136 141 p 17 
17 145 150 q 18 
18 154 159 r 24 

[[4]] 
    start stop ID score 
5  37 42 e  9 
14 118 123 n  8 
15 127 132 o  7 
+0

접근 방식을 사용한다면 정확히 동일한 출력 형식을 얻을 수 있습니까?expand.grid를 사용하는 것은 매우 현명한 일이며 내 예상 출력을 얻을 수 있다고 생각합니다. 그러나 매트릭스 또는 data.frame에 출력을 넣으려면 어떻게해야합니까? 나는 같은 차원의 벡터를 합쳐 놓고 싶다. 고맙습니다. – user88911

+1

@ user88911 'a <- a [order (a $ Var1),]'와 같이 순서가 지정된'a'를 사용 하시겠습니까? – Jimbou

+0

그냥 완벽한 대답. 여기에 큰 도움을 주신 것에 대해 다시 한 번 감사드립니다. – user88911

2

제프 당신이 원하는 무엇인가요?

outd <- function(ele_, li) base::setdiff(ele_, li) 
mapply(outd, a_new, tar.list, SIMPLIFY = FALSE) 

> mapply(outd, a_new, tar.list, SIMPLIFY = FALSE) 
$big 
    start stop ID score 
1  1 6 a 12 
6  46 51 f 20 
8  64 69 h 24 
9  73 78 i 13 
10 82 87 j 11 
12 100 105 l 19 
14 118 123 n 16 
15 127 132 o 18 
16 136 141 p 22 
17 145 150 q 23 
18 154 159 r 14 

$sml 
    start stop ID score 
2 10 15 b  9 
7 55 60 g 10 

이전 경우 mapply 편집

이 목록 요소 쌍에 함수를 적용한다. 우리가 두 목록을 확장 outer에서 ideia을 경우

, 우리는 (다른 경우에는 작동 있는지 확실하지 않습니다) 수 :

bY <- rep(tar.list, rep.int(length(a_new), length(tar.list))) 
bX <- rep(a_new, times = ceiling(length(bY)/length(a_new))) 
mapply(outd, bX, bY, SIMPLIFY = FALSE) 

> mapply(outd, bX, bY, SIMPLIFY = FALSE) 
$big 
    start stop ID score 
1  1 6 a 25 
2  10 15 b 23 
4  28 33 d 14 
7  55 60 g 19 
9  73 78 i 20 
10 82 87 j 21 
12 100 105 l 13 
13 109 114 m 12 
14 118 123 n 22 
16 136 141 p 15 
17 145 150 q 18 

$sml 
    start stop ID score 
6  46 51 f  9 
8  64 69 h  8 
18 154 159 r 10 

$big 
    start stop ID score 
1  1 6 a 25 
2  10 15 b 23 
4  28 33 d 14 
7  55 60 g 19 
9  73 78 i 20 
10 82 87 j 21 
12 100 105 l 13 
13 109 114 m 12 
14 118 123 n 22 
16 136 141 p 15 
17 145 150 q 18 

$sml 
    start stop ID score 
6  46 51 f  9 
8  64 69 h  8 
18 154 159 r 10 
+0

mapply를 사용하여 왜 내가 한 것처럼 출력의 정확한 치수를 반환하지 않았습니까? mapply를 사용하면 어떻게 만들 수 있습니까? 고마워요 – user88911

+0

추가 된 편집보기 – Robert

+0

고맙습니다. – user88911

관련 문제