r - 来自集群和共现因子列表的维恩图

标签 r combinations data-visualization factor-analysis

我有一个输入文件,其中包含约 50000 个集群的列表,并且每个集群中都存在许多因素(总共约 1000 万个条目),请参阅下面的较小示例:

set.seed(1)
x = paste("cluster-",sample(c(1:100),500,replace=TRUE),sep="")
y = c(
  paste("factor-",sample(c(letters[1:3]),300, replace=TRUE),sep=""),
  paste("factor-",sample(c(letters[1]),100, replace=TRUE),sep=""),
  paste("factor-",sample(c(letters[2]),50, replace=TRUE),sep=""),
  paste("factor-",sample(c(letters[3]),50, replace=TRUE),sep="")
)
data = data.frame(cluster=x,factor=y)

在另一个问题的帮助下,我得到了一个饼图,用于同时出现这样的因素:
counts = with(data, table(tapply(factor, cluster, function(x) paste(as.character(sort(unique(x))), collapse='+'))))
pie(counts[counts>1])

但现在我想要一个关于因素共现的维恩图。理想情况下,也可以采用每个因素的最小计数阈值的方式。例如,不同因素的维恩图,因此每个因素都必须在每个集群中出现 n>10 才能被考虑在内。

我试图找到一种使用聚合生成表计数的方法,但无法使其工作。

最佳答案

我提供了两种解决方案,使用两种不同的具有维恩图功能的包。正如您所料,两者都涉及使用 aggregate() 的初始步骤。功能。

我倾向于更喜欢 venneuler 的结果包裹。它的默认标签位置并不理想,但您可以通过查看相关联的 plot 来调整它们。方法(可能使用 locator() 来选择坐标)。

解决方案一:

一种可能性是使用 venneuler()venneuler包来绘制你的维恩图。

library(venneuler)

## Modify the "factor" column, by renaming it and converting
## it to a character vector.
levels(data$factor) <- c("a", "b", "c")
data$factor <- as.character(data$factor)

## FUN is an anonymous function that determines which letters are present
## 2 or more times in the cluster and then pastes them together into 
## strings of a form that venneuler() expects.
##
inter <- aggregate(factor ~ cluster, data=data,
                   FUN = function(X) {
                       tab <- table(X)
                       names <- names(tab[tab>=2])
                       paste(sort(names), collapse="&")
                   })            
## Count how many clusters contain each combination of letters
counts <- table(inter$factor)
counts <- counts[names(counts)!=""]  # To remove groups with <2 of any letter
#  a   a&b a&b&c   a&c     b   b&c     c 
# 19    13    12    14    13     9    12 

## Convert to proportions for venneuler()
ps <- counts/sum(counts)

## Calculate the Venn diagram
vd <- venneuler(c(a=ps[["a"]], b = ps[["b"]], c = ps[["c"]],
                  "a&b" = ps[["a&b"]],
                  "a&c" = ps[["a&c"]],
                  "b&c" = ps[["b&c"]],
                  "a&b&c" = ps[["a&b&c"]]))
## Plot it!
plot(vd)

关于我在编写此代码时所做的选择的一些说明:
  • 我已经从 "factor-a" 更改了因子的名称至 "a" .你显然可以把它改回来。
  • 我只要求在每个集群中计算每个因素 >=2 次(而不是 >10)。 (那是为了用你的数据的这个小子集来演示代码。)
  • 如果你看一下中间对象counts ,您将看到它包含一个初始未命名元素。该元素是包含少于 2 个字母的簇数。您可以比我更好地决定是否要将这些包括在后续 ps 的计算中。 ('比例') 对象。

  • enter image description here

    解决方案二:

    另一种可能性是雇用vennCounts()vennDiagram()在生物导体包装中 limma .要下载软件包,follow the instructions here.不像venneuler上面的解决方案,结果图中的重叠与实际的交叉程度不成正比。相反,它用实际频率对图表进行注释。 (请注意,此解决方案不涉及对 data$factor 列的任何编辑。)
    library(limma)
    
    out <- aggregate(factor ~ cluster, data=data, FUN=table)
    out <- cbind(out[1], data.frame(out[2][[1]]))
    
    counts <- vennCounts(out[, -1] >= 2)
    vennDiagram(counts, names = c("Factor A", "Factor B", "Factor C"),
                cex = 1, counts.col = "red")
    

    enter image description here

    关于r - 来自集群和共现因子列表的维恩图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8153594/

    相关文章:

    r - 生成具有 15 分钟时间间隔和今天日期的字符串 csv 名称列表

    r - 如何处理R中的大量情节

    算法:打印字符序列的正确索引

    python - 如何在 while 循环中省略 it.combinations() 的一些结果

    c - multiset 和 set 混合的可能的字符串排列

    python - 如何根据带有权重的数据创建箱线图?

    python - python中有一个包可以创建每月热图吗?

    r - 使用gmailr发送HTML消息

    r - 如何根据 R 中元素的长度对列表进行子集化

    r summarise_if 有多个条件