2013-01-22 4 views
3

Category이라는 GROUPED BY 값의 두 세트를 전달할 수 있기를 원합니다. 패키지 plyr에서 ddply을 사용하여이 작업을 수행 할 수있는 방법이 있습니까?열을 기반으로 값을 ddply로 전달할 수 있습니까?

ddply(idata.frame(data), .(Category), wilcox.test, data[Type=="PRE",], data[Type=="POST",]) 

wilcox.test는 다음과 같은 기능입니다 :

나는 이런 식으로 뭔가하고 싶은

Description 

Performs one- and two-sample Wilcoxon tests on vectors of data; the latter is also known as ‘Mann-Whitney’ test. 

Usage 

wilcox.test(x, ...) 

Arguments 

x 
numeric vector of data values. Non-finite (e.g. infinite or missing) values will be omitted. 

y 
an optional numeric vector of data values: as with x non-finite values will be omitted. 

.... rest of the arguments snipped .... 

을 내가 가지고 dput에서 다음과 같은 출력 :

structure(list(Category = c("A", "C", 
"B", "C", "D", "E", 
"C", "A", "F", "B", 
"E", "C", "C", "A", 
"C", "A", "B", "H", 
"I", "A"), Type = c("POST", "POST", 
"POST", "POST", "PRE", "POST", "POST", "PRE", "POST", 
"POST", "POST", "POST", "POST", "PRE", "PRE", "POST", 
"POST", "POST", "POST", "POST"), Value = c(1560638113, 
1283621, 561329742, 2727503, 938032, 4233577690, 0, 4209749646, 
111467236, 174667894, 1071501854, 720499, 2195611, 1117814707, 
1181525, 1493315101, 253416809, 327012982, 538595522, 3023339026 
)), .Names = c("Category", "Type", "Value"), row.names = c(21406L, 
123351L, 59875L, 45186L, 126720L, 94153L, 48067L, 159371L, 54303L, 
63318L, 104100L, 58162L, 41945L, 159794L, 57757L, 178622L, 83812L, 
130655L, 30860L, 24513L), class = "data.frame") 

어떤 제안이?

ddply(idata.frame(data), .(Category), 
    function(x) wilcox.test(x[Type == "PRE",], x[Type == "POST",]) 

난 당신이 자신에게 조금 조정할해야합니다 있도록 wilcox.test 기능이 기본적으로 data.frame에 연결하는 뭔가 좋은 반환 확실하지 않다 :

답변

4

은 내가 항상하는 익명 함수를 사용하는 것입니다 . 또는 dlply을 사용하여 wilcox.test 출력 목록을 작성하십시오.

2

여기에 두 가지 문제가 있습니다 : 나는 매우 동일한 데이터를 사용하고 있지만

  1. 바울의 솔루션은, 내 경우에는 작동하지 않는가. 내가 subsetting에 대한 구문이 원인에 있다고 생각하지만, 오류를 크랙 관리하지 않았다.

  2. 데이터가 실제로 비교하기에 너무 작아서 사용하려는 구조 (즉, Category x Type)에 대해 통계적 테스트를 통해 계산할 수 없습니다. 당신이 당신의 데이터 프레임의 범주의 수를 보면 결국, 모든 미만 30의 값을 가지고 있고, 절반은 하나 개의 값이 :

    > table(data$Category) 
    A B C D E F H I 
    5 3 6 1 2 1 1 1 
    

그러나 좋은 소식은 내가 해결책을 찾을 것입니다 너를 위해서.

우선 더 넓은 테이블을 생성해야했습니다. I이었다 때문에 (매우) 게으른, 단순히 이런 짓을 : 나는, 테이블 10 번 중복 숫자 값에 노이즈를 추가하고 추가 동일한 비율로 무작위로 "PRE"와 "POST"를 재 할당

for(i in 1:10){data <- rbind(data,data)} 

data$Value <- jitter(data$Value,5e3) 

data$Type <- sample(c("POST","PRE"),size=nrow(data),replace=T,prob=c(0.80,0.20)) 

초기 데이터 프레임에서. 값 자체는 여기에서 중요하지 않다는 점에 유의하십시오, 저는 여러분이 우리에게 준 것과 동일한 데이터 구조를 사용하기 만합니다.

이 방법, 우리는 훨씬 더 큰 테이블과 끝, 그리고 - 더 중요한 것은 - 밀도 테이블 :

> table(data$Category, data$Type) 

     POST PRE 
    A 4135 985 
    B 2470 602 
    C 4881 1263 
    D 814 210 
    E 1634 414 
    F 815 209 
    H 846 178 
    I 813 211 

은 그래서 이루어집니다!

이제 해결책을 찾아 낼 수 있습니다. 명확성을 위해 Wilcoxon 테스트를 별도로 수행하는 함수를 작성했습니다. 트릭은 출력에 필요한 데이터 프레임에 통합 될 벡터를 반환해야한다는 것입니다.물론 아무것도의

> ddply(data, .(Category), .fun = wx ) 
    Category  V1  V2 
      A 2047794 0.7862484 
      B 725554 0.3585648 
      C 3071435 0.8459535 
      D 80693 0.2112926 
      E 347314 0.3984288 
      F 83304 0.6252554 
      H 71762 0.3247840 
      I 88874 0.4177269 

가 중요하다, 나는를 구축하는 방식 주어진 : 당신은 당신의 데이터 프레임에 기능을 적용 할 수 있고, 마지막으로

wx <- function(d){ 
w <- wilcox.test(
    # First vector (x) 
    subset(d, Type == "PRE", select = Value)[,1], 
    subset(d, Type == "POST", select = Value)[,1] 
    ) 
    # c(1,3) returns the Stat and the P-value (tweak that if you want something else) 
    return(w[c(1,3)]) 
    } 

:

의 함수 wx를 부르 자 테이블에 있지만 V1에는 통계가 있고 V2에는 P- 값이 있습니다.

+0

+1 위대한 설명에 감사드립니다. :) – Legend

관련 문제