2011-11-14 1 views
12

~ 50000 개의 클러스터 목록과 각 요소에 여러 가지 요소가있는 입력 파일이 있습니다 (총 1,000 만 개 항목). 작은 예를 아래에 : 또 다른 질문에서 약간의 도움으로클러스터 및 공동 발생 요인 목록의 벤 다이어그램

set.seed(1) 
x = paste("cluster-",sample(c(1:100),500,replace=TRUE),sep="") 
y = c(
    paste("factor-",sample(c(letters[1:3]),300, replace=TRUE),sep=""), 
    paste("factor-",sample(c(letters[1]),100, replace=TRUE),sep=""), 
    paste("factor-",sample(c(letters[2]),50, replace=TRUE),sep=""), 
    paste("factor-",sample(c(letters[3]),50, replace=TRUE),sep="") 
) 
data = data.frame(cluster=x,factor=y) 

,이 같은 요인의 동시 발생에 대한 pieChart를 생산하기 위해 그것을 가지고 :

counts = with(data, table(tapply(factor, cluster, function(x) paste(as.character(sort(unique(x))), collapse='+')))) 
pie(counts[counts>1]) 

을하지만 지금은하고 싶은 요인의 동시 발생에 대한 도표. 이상적으로는 각 요인에 대한 최소 카운트에 대한 임계 값을 취할 수있는 방법으로도 가능합니다. 예를 들어, 각 요소가 고려 될 각 클러스터에 n> 10이 있어야하기 때문에 여러 요인에 대한 다이어그램.

집계를 사용하여 테이블 수를 산출하는 방법을 찾으려고했지만 작동하지 못했습니다.

+2

당신이 벤 다이어그램을위한 R 패키지의 봤어? G. Jay Kerns의 [venneuler' 라이브러리를 사용한 [최근 예제] (http://stats.stackexchange.com/questions/16802/derive-pc-ab-from-coxs-two-rules/18209#18209)를 참조하십시오. , 또는 venn' 라이브러리를 사용하는 Stat 소프트웨어 저널 (Murdoch, 2004) (http://www.jstatsoft.org/v11/c01)의이 간략한 기사를 참고하십시오. 이것이 순수하게 R 프로그래밍에 관한 것이라면 SO로 마이그레이션해야합니다. –

+1

Avilella,이 질문은 주제와 조금 떨어져 있기 때문에 답변을 얻지 못할 수도 있습니다. 활성 R 사용자 커뮤니티가있는 SO를 더 잘 수행 할 수 있습니다. 그러나 교차 게시하지 마십시오. 이동하려는 경우 운영자의주의를 위해 플래그를 지정하십시오. – whuber

+0

깃발을 꽂았으나 아직 움직이지 않은 것을 볼 수는 없습니다 ... – 719016

답변

20

저는 벤 다이어그램 기능이있는 두 개의 다른 패키지를 사용하여 두 가지 솔루션을 제공했습니다. 예상대로, 둘 다 aggregate() 기능을 사용하는 초기 단계가 필요합니다.

venneuler 패키지의 결과를 선호하는 경향이 있습니다. 기본 라벨 위치는 이상적이지 않지만 관련메소드 (가능한 경우 locator()을 사용하여 좌표를 선택)를 보면이를 조정할 수 있습니다.

해결 방법 1 :

하나의 가능성은 벤 다이어그램을 그릴 수 venneuler 패키지에 venneuler()을 사용하는 것입니다.

library(venneuler) 

## Modify the "factor" column, by renaming it and converting 
## it to a character vector. 
levels(data$factor) <- c("a", "b", "c") 
data$factor <- as.character(data$factor) 

## FUN is an anonymous function that determines which letters are present 
## 2 or more times in the cluster and then pastes them together into 
## strings of a form that venneuler() expects. 
## 
inter <- aggregate(factor ~ cluster, data=data, 
        FUN = function(X) { 
         tab <- table(X) 
         names <- names(tab[tab>=2]) 
         paste(sort(names), collapse="&") 
        })    
## Count how many clusters contain each combination of letters 
counts <- table(inter$factor) 
counts <- counts[names(counts)!=""] # To remove groups with <2 of any letter 
# a a&b a&b&c a&c  b b&c  c 
# 19 13 12 14 13  9 12 

## Convert to proportions for venneuler() 
ps <- counts/sum(counts) 

## Calculate the Venn diagram 
vd <- venneuler(c(a=ps[["a"]], b = ps[["b"]], c = ps[["c"]], 
        "a&b" = ps[["a&b"]], 
        "a&c" = ps[["a&c"]], 
        "b&c" = ps[["b&c"]], 
        "a&b&c" = ps[["a&b&c"]])) 
## Plot it! 
plot(vd) 

이 코드를 작성에있는 선택 사항에 대한 몇 가지 참고 사항 : 나는 "factor-a"에서 "a"에 요소의 이름을 변경 한

  • . 당신은 분명히 그 것을 되돌릴 수 있습니다.

  • 필자는 각 요소가> 10 시간이 아닌> 2 회 이상 존재해야 각 클러스터 내에서 계산되도록 요구했습니다. (데이터의이 작은 하위 집합으로 코드를 보여준 것입니다.) counts 중간 개체를 보면 이름없는 초기 요소가 있음을 알 수 있습니다. 이 요소는 모든 문자가 2 개 미만인 클러스터의 수입니다. 후속 ps ('비율') 개체의 계산에 포함 할 것인지 여부를 결정하는 것보다 더 나은 결정을 내릴 수 있습니다.

enter image description here

솔루션 2는 :

또 다른 가능성은 Bioconductor 패키지 limmavennCounts()vennDiagram()을 사용하는 것이다. 패키지를 다운로드하려면 follow the instructions here. 위의 venneuler 솔루션과 달리 결과 다이어그램의 겹치는 부분은 실제 교차점의 정도에 비례하지 않습니다. 대신 다이어그램에 실제 주파수를 주석으로 표시합니다.(이 솔루션은 data$factor 컬럼에 대한 편집 내용을 포함하지 않습니다.)

library(limma) 

out <- aggregate(factor ~ cluster, data=data, FUN=table) 
out <- cbind(out[1], data.frame(out[2][[1]])) 

counts <- vennCounts(out[, -1] >= 2) 
vennDiagram(counts, names = c("Factor A", "Factor B", "Factor C"), 
      cex = 1, counts.col = "red") 

enter image description here

관련 문제