2012-07-30 6 views
2

안녕하세요 저는 R이 처음인데 벤 다이어그램을 만들기 위해 사용해야합니다. 나는 잠시 동안 인터넷 검색을 해왔고 이진 변수를 다룰 수있는 모든 예제를 다뤘다. 그러나 나는 2 개의 목록 (잘 실제로 2 csv 파일)이 있습니다. 목록에있는 항목은 PSF113_xxxx와 같은 단순한 문자열입니다. 나는 각각을 고유하고 공유되는 것을보기 위해 그것들을 비교해야합니다. R에서이 다이어그램을 어떻게 만들 수 있습니까?R에서 venn 다이어그램을 만드는 방법은 무엇입니까?

또한 파일의 수는 같지 않지만 다른 하나는 약간 더 크므로 cbind 함수가 오류를 반환합니다.

나는 지금까지 이것까지 생각해 냈지만, 이것은 내면 1과 외면 0을 가진 그룹 1이라는 원이있는 이미지를 얻습니다.

matLis <- list(matrix(A), matrix(B)) 

n <- max(sapply(matLis, nrow)) 
do.call(cbind, lapply(matLis, function (x) 
    rbind(x, matrix(, n-nrow(x), ncol(x))))) 

x = vennCounts(n) 
vennDiagram(x) 

내가했던 왼쪽의 번호가 아무것도 아닌 데이터

2 PSF113_0018 
3 PSF113_0079 
4 PSF113_0079a 
5 PSF113_0079b 

의 예입니다, 그것은 추가 한 나는 를 엑셀

에서 R로 파일을 가져올 때
head(A) 
> head(A) 
      V1 
1 PSF113_0016a 
2 PSF113_0018 
3 PSF113_0079 
4 PSF113_0079a 
5 PSF113_0079b 
6 PSF113_0079c 

> head(b,10) 
      V1 
1 PSF113_0016a 
2 PSF113_0021 
3 PSF113_0048 
4 PSF113_0079 
5 PSF113_0079a 
6 PSF113_0079b 
7 PSF113_0079c 
8 PSF113_0295 
9 PSF113_0324a 
10 PSF113_0324b 
+0

데이터를 재현 할 수있는 예제를 제공하면 조금 더 도움이 될 것입니다. –

답변

2

A 또는 B를 정의하지 않았기 때문에 여전히 코드를 재생성 할 수 없습니다. venneuler의 venn 다이어그램에 대한 가이드가 있습니다.

List1 <- c("apple", "apple", "orange", "kiwi", "cherry", "peach") 
List2 <- c("apple", "orange", "cherry", "tomatoe", "pear", "plum", "plum") 
Lists <- list(List1, List2) #put the word vectors into a list to supply lapply 
items <- sort(unique(unlist(Lists))) #put in alphabetical order 
MAT <- matrix(rep(0, length(items)*length(Lists)), ncol=2) #make a matrix of 0's 
colnames(MAT) <- paste0("List", 1:2) 
rownames(MAT) <- items 
lapply(seq_along(Lists), function(i) { #fill the matrix 
    MAT[items %in% Lists[[i]], i] <<- table(Lists[[i]]) 
}) 

MAT #look at the results 
library(venneuler) 
v <- venneuler(MAT) 
plot(v) 

편집 : 머리가 우리에게 작업 할 무엇인가를 줄 것을 매우 도움이된다. 여기에서

#For reproducibility (skip this and read in the csv files) 
A <- structure(list(V1 = structure(1:6, .Label = c("PSF113_0016a", 
    "PSF113_0018", "PSF113_0079", "PSF113_0079a", "PSF113_0079b", 
    "PSF113_0079c"), class = "factor")), .Names = "V1", 
    class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6")) 

B <- structure(list(V1 = structure(1:10, .Label = c("PSF113_0016a", 
    "PSF113_0021", "PSF113_0048", "PSF113_0079", "PSF113_0079a", 
    "PSF113_0079b", "PSF113_0079c", "PSF113_0295", "PSF113_0324a", 
    "PSF113_0324b"), class = "factor")), .Names = "V1", 
    class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10")) 

실행 코드 :이 방법을 시도

#after reading in the csv files start here 
Lists <- list(A, B) #put the word vectors into a list to supply lapply 
Lists <- lapply(Lists, function(x) as.character(unlist(x))) 
items <- sort(unique(unlist(Lists))) #put in alphabetical order 
MAT <- matrix(rep(0, length(items)*length(Lists)), ncol=2) #make a matrix of 0's 
colnames(MAT) <- paste0("List", 1:2) 
rownames(MAT) <- items 
lapply(seq_along(Lists), function(i) { #fill the matrix 
    MAT[items %in% Lists[[i]], i] <<- table(Lists[[i]]) 
}) 

MAT #look at the results 
library(venneuler) 
v <- venneuler(MAT) 
plot(v) 

을이 방법의 차이가 나는 두 데이터 프레임을 목록에없는 것이 었습니다 (그들은 dataframes이라면) 및 문자 벡터로 설정 . 나는 이것이 효과가 있다고 생각한다.

+0

A 및 B는 내가 가져온 csv 파일이며, 실제로는 A = open.csv (...)입니다. 데이터의 예제는 A 나 B를 호출하면 얻을 수있는 것을 제공합니다. 감사합니다. 이것을 시도해 보겠습니다. – TheFoxx

+0

'head (A, 10)'와'head (B)'를 시도하십시오 –

+0

코드에서 sort 함수의 데이터가 원자 적이어야한다는 오류 메시지가 나타납니다. 도와 드릴까요? 이전에 내가 말한 것처럼 데이터를 호출하면 OP – TheFoxx

관련 문제