-1

我的问题很简单..但我无法解决...我已经在 R 中使用 1000 次迭代对 2000 个基因运行了一个变量选择方法,并且在每次迭代中我得到了一个基因组合。我想计算每个基因组合在 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"

因此,对于列表中的每组基因,您可以通过将其包裹在 a 周围来执行相同的操作sapply,如下所示:

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
于 2013-04-01T10:20:20.560 回答