2017-10-08 1 views
0

를 적용하면 I가 벡터 v 매트릭스 m 있고 (vm 열 사이의 상관 관계) cor.test 함수 결과의 서브 세트를 추출하는 발라 중첩리스트의 구조를 제어. 상기 구조 I 출력 (2 레벨에서)로하고자 -FUN 반환 목록 또는 NA

set.seed(1) 
m <- matrix(runif(12), nrow = 3) 
v <- 3:1 

res <- apply(m, 2, function(x) { 
    cor.test(x, v, method = 'spearman', exact = F)[c(1,3,4)] 
}) 

m의 열들의 수와 동일한 길이를 갖는리스트의 중첩 된리스트이다. 루프를 적용하고 필터링 된 결과 (여기서는 네 결과의 길이를 유지) 나타내는데 NA를 반환 내에 I 각 cor.test 결과를 필터링 할

> str(res) 
List of 4 
$ :List of 3 
    ..$ statistic: Named num 8 
    .. ..- attr(*, "names")= chr "S" 
    ..$ p.value : num 0 
    ..$ estimate : Named num -1 
    .. ..- attr(*, "names")= chr "rho" 
$ :List of 3 
    ..$ statistic: Named num 2 
    .. ..- attr(*, "names")= chr "S" 
    ..$ p.value : num 0.667 
    ..$ estimate : Named num 0.5 
    .. ..- attr(*, "names")= chr "rho" 
$ :List of 3 
    ..$ statistic: Named num 0 
    .. ..- attr(*, "names")= chr "S" 
    ..$ p.value : num 0 
    ..$ estimate : Named num 1 
    .. ..- attr(*, "names")= chr "rho" 
$ :List of 3 
    ..$ statistic: Named num 6 
    .. ..- attr(*, "names")= chr "S" 
    ..$ p.value : num 0.667 
    ..$ estimate : Named num -0.5 
    .. ..- attr(*, "names")= chr "rho" 

는 상기 p.value 말한다.

res <- apply(m, 2, function(x) { 
    tmp <- cor.test(x, v, method = 'spearman', exact = F)[c(1,3,4)] 
    ifelse(tmp$p.value < 0.1, list(tmp), NA) 
}) 

내 문제는 우리가 지금 3 레벨리스트 구조를 얻을 수 있다는 것입니다

res2 <- apply(m, 2, function(x) { 
    tmp <- cor.test(x, v, method = 'spearman', exact = F)[c(1,3,4)] 
    ifelse(tmp$p.value < 0.1, list(tmp), NA) 
    }) 

> str(res2) 
List of 4 
$ :List of 1 
    ..$ :List of 3 
    .. ..$ statistic: Named num 8 
    .. .. ..- attr(*, "names")= chr "S" 
    .. ..$ p.value : num 0 
    .. ..$ estimate : Named num -1 
    .. .. ..- attr(*, "names")= chr "rho" 
$ : logi NA 
$ :List of 1 
    ..$ :List of 3 
    .. ..$ statistic: Named num 0 
    .. .. ..- attr(*, "names")= chr "S" 
    .. ..$ p.value : num 0 
    .. ..$ estimate : Named num 1 
    .. .. ..- attr(*, "names")= chr "rho" 
$ : logi NA 

apply에서 첫 번째 결과가 결과 구조는 다음 필터링되지 않은 들어갈 수 apply 때문에 분명히 같은 요구되는 NA 경우 구조에 대한 결과.

res3 <- apply(m, 2, function(x) { 
    tmp <- cor.test(x, v, method = 'spearman', exact = F)[c(1,3,4)] 
    ifelse(tmp$p.value > 0.1, list(tmp), NA) #'invert' the test 
}) 

>res3 
List of 4 
$ : logi NA 
$ :List of 3 
    ..$ statistic: Named num 2 
    .. ..- attr(*, "names")= chr "S" 
    ..$ p.value : num 0.667 
    ..$ estimate : Named num 0.5 
    .. ..- attr(*, "names")= chr "rho" 
$ : logi NA 
$ :List of 3 
    ..$ statistic: Named num 6 
    .. ..- attr(*, "names")= chr "S" 
    ..$ p.value : num 0.667 
    ..$ estimate : Named num -0.5 
    .. ..- attr(*, "names")= chr "rho" 

내가 헛되이 ifelse(tmp$p.value < 0.1, tmp, NA)ifelse(tmp$p.value < 0.1, list(tmp), list(NA))를 반환하는 것을 시도했다.

내가 찾은 유일한 해결책은 apply 외부 NA을 할당하는 것입니다 : 분명히

res4 <- apply(m, 2, function(x) { 
    cor.test(x, v, method = 'spearman', exact = F)[c(1,3,4)] 
}) 
res4[sapply(res4, "[[", 2) > 0.1] <- NA 

, I 적용의 내부 동작에 대해 뭔가를 그리워.

+0

나는 높게보고 추천 '빗자루'패키지는 추출 전에 깔끔한 데이터 프레임으로 결과를 단순화합니다. –

답변

2

문제는 apply이 아니라 ifelse입니다. 대신 if() {} else {}를 사용하는 경우이 방법은 당신이 시험과 동일한 형태로 값을 반환 ifelse ifelse

에서

res3 <- apply(m, 2, function(x) { 
     tmp <- cor.test(x, v, method = 'spearman', exact = F)[c(1,3,4)] 
     if (tmp$p.value < 0.1) { return(tmp) } else { return(NA) } 
    }) 

str(res3) 
# List of 4 
# $ :List of 3 
    # ..$ statistic: Named num 8 
    # .. ..- attr(*, "names")= chr "S" 
    # ..$ p.value : num 0 
    # ..$ estimate : Named num -1 
    # .. ..- attr(*, "names")= chr "rho" 
# $ : logi NA 
# $ :List of 3 
    # ..$ statistic: Named num 0 
    # .. ..- attr(*, "names")= chr "S" 
    # ..$ p.value : num 0 
    # ..$ estimate : Named num 1 
    # .. ..- attr(*, "names")= chr "rho" 
# $ : logi NA 

참고 문서를하려는 작동

+1

귀하의 견적이 문제를 설명하는 최선의 방법이 아니라고 생각합니다. ifelse (TRUE, list (a = 1, b = 2)), NA)'와 ifelse (FALSE, list (a = 1, b = 2) 오히려 나는'ifelse'로'list (list (...))'를 반환해야한다는 문제를 말할 것입니다. –

+1

내 단어 선택이 아닌 '모양'이 여기에 모호합니다 ... 물론 당신이 말하는 것은 옳습니다. 'list (list (...)) '를 반환해야합니다. 하지만 이해할 수있는 것은'test '가 1 요소이기 때문에'return (tmp)'는 출력의 첫 번째 요소 (목록의 첫 번째 요소) 만 반환한다는 것입니다. OP는 전체리스트를 유지하기를 원하기 때문에, OP는'if (condition) {} else {}'가 작동하지 않는 이유는 * if (list (...) 모양 *을 출력합니다. – CPak

+0

동의합니다! 또한 당신의 솔루션이 훌륭하다는 것을 알 수 있습니다. 당신이 무엇을 의미하는지는 분명치 않았습니다. ifelse의 문서를 참고하십시오. –