-1

私の質問は非常に単純です..しかし、私はそれを解決することができません.1000回の反復を使用して2000個の遺伝子に対してRで変数選択法を実行し、各反復で遺伝子の組み合わせを得ました。Rで遺伝子の各組み合わせが発生する回数を数えたいと思います。たとえば、

# for iteration 1
genes[1] "a" "b" "c"
# for iteration 2
genes[2] "a" "b"
# for iteration 3
genes[3] "a" "c"
# for iteration 4
genes [4] "a" "b"

そして、これは私に与えるでしょう

"a" "b" "c"  1
"a" "b"      2
"a"  "c"     1

リストを非公開にして、各遺伝子の番号を取得しましたが、興味があるのはその組み合わせです。テーブルを作成しようとしましたが、各遺伝子ベクターの長さが等しくありません。前もって感謝します。

4

1 に答える 1

1

私がすぐに考えることができる方法は、次のよう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"

これでunlista を取得し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
于 2013-04-01T10:20:20.560 に答える