私がすぐに考えることができる方法は、次のようpaste
に使用することです。table
genes_p <- sapply(my_genes, paste, collapse=";")
freq <- as.data.frame(table(genes_p))
# Var1 Freq
# 1 a;b 2
# 2 a;b;c 1
# 3 c 1
上記の解決策は、遺伝子が名前でソートされ、同じ遺伝子 ID がリストの要素内で複数回出現しないことを前提としています。両方を考慮したい場合は、次のようにします。
# sort genes before pasting
genes_p <- sapply(my_genes, function(x) paste(sort(x), collapse=";"))
# sort + unique
genes_p <- sapply(my_genes, function(x) paste(sort(unique(x)), collapse=";"))
編集: OPのコメントの質問に続いて、アイデアは、可能な限り2'ersのすべての組み合わせ(つまり)を取得してから、テーブルを取ることです。まず、コードを分解して、理解できるように分けて書きます。次に、それらをグループ化してワンライナーを作成します。
# you first want all possible combinations of length 2 here
# that is, if vector is:
v <- c("a", "b", "c")
combn(v, 2)
# [,1] [,2] [,3]
# [1,] "a" "a" "b"
# [2,] "b" "c" "c"
これにより、一度に 2 つのすべての組み合わせが得られます。これで、同様に貼り付けることができます。combn
関数の引数も許可します。
combn(v, 2, function(y) paste(y, collapse=";"))
# [1] "a;b" "a;c" "b;c"
したがって、リスト内の遺伝子の各セットについて、sapply
次のようにこれを a でラップすることにより、同じことを行うことができます。
sapply(my_genes, function(x) combn(x, min(length(x), 2), function(y)
paste(y, collapse=";")))
min(length(x), 2)
遺伝子リストの一部は 1 つの遺伝子だけである可能性があるため、 が必要です。
# [[1]]
# [1] "a;b" "a;c" "b;c"
# [[2]]
# [1] "a;b"
# [[3]]
# [1] "c"
# [[4]]
# [1] "a;b"
これでunlist
a を取得しvector
、次に使用table
して頻度を取得できます。
table(unlist(sapply(l, function(x) combn(x, min(length(x), 2), function(y)
paste(y, collapse=";")))))
# a;b a;c b;c c
# 3 1 1 1
これを順番にラップしてas.data.frame(.)
、次を取得できますdata.frame
。
as.data.frame(table(unlist(sapply(l, function(x) combn(x, min(length(x), 2),
function(y) paste(y, collapse=";"))))))
# Var1 Freq
# 1 a;b 3
# 2 a;c 1
# 3 b;c 1
# 4 c 1