2

こんにちは、R は初めてなので、R を使用してベン図を作成する必要があります。私はしばらくそれをグーグルで調べてきましたが、見つけることができるすべての例はバイナリ変数を扱っています。ただし、2 つのリスト (実際には 2 つの csv ファイル) があります。リスト内の項目は、PSF113_xxxx のような単なる文字列です。それらを比較して、それぞれに固有のものと共有されているものを確認する必要があります。Rでこれからベン図を作成するにはどうすればよいですか?

また、ファイルには同じ数のものが含まれていません。一方が他方よりわずかに多いため、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

左側の番号付けは私が行ったものではなく、ファイルを Excel から 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
4

1 に答える 1

2

AまたはBを定義していないため、コードの再現性はまだ高くありませんvenneuler。より柔軟であることがわかったため、パッケージ内のベン図のガイドを次に示します。

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)

このアプローチの違いは、2つのデータフレーム(データフレームの場合)のリストを解除してから、それらを文字ベクトルに変換したことです。これでうまくいくと思います。

于 2012-07-30T13:52:53.960 に答える