获取维恩图中的项目列表

2023-11-24

使用以下代码很容易绘制维恩图:

library(VennDiagram)

set.seed(1) # For reproducibility of results
xx.1 <- list(A = sample(LETTERS, 15), B = sample(LETTERS, 15), 
             C = sample(LETTERS, 15), D = sample(LETTERS, 15))

venn.diagram(xx.1, filename ="1.tiff", height = 1000, width = 1000)

A venn diagram with four sets

但是如何找出每个字段中的项目呢?比如我想知道A中只出现的两个字母是什么?

EDIT:

这是我的解决方案,它并不完美,但可以给出所有交集。

library(reshape)
library(R.utils)

## data
A <- data.frame(names = sample(LETTERS, 15), A = 1)
B <- data.frame(names = sample(LETTERS, 15), B = 1)
C <- data.frame(names = sample(LETTERS, 15), C = 1)
D <- data.frame(names = sample(LETTERS, 15), D = 1)

## a merged data frame.
xx.1 <- list(A = A, B= B, C= C, D = D)
xx.2 <- merge_recurse(xx.1)

## function
ff.vennFourItems <- function(X)
{
    ## get the items from venn diagram; for four sets, there are 15 fields;

    vennItems <- list()
    cate.n <- names(X)[2:5]

    for (i in 1:15)
    {
        xx.b <- intToBin(i)
        ## make it four bits;
        if (nchar(xx.b) != 4)
        {
            xx.b <- paste(paste(rep("0", 4 - nchar(xx.b)), collapse = ""), xx.b, sep ="") 
        }

        xx.b.1 <- unlist(strsplit(xx.b, ""))

        xx.1 <- X

        if(xx.b.1[1] == "0") { xx.1 <- xx.1[is.na(xx.1[, 2]), ] }
        else { xx.1 <-  xx.1[!is.na(xx.1[, 2]), ] }

        if(xx.b.1[2] == "0") { xx.1 <- xx.1[is.na(xx.1[, 3]), ] }
        else { xx.1 <-  xx.1[!is.na(xx.1[, 3]), ] }

        if(xx.b.1[3] == "0") { xx.1 <- xx.1[is.na(xx.1[, 4]), ] }
        else { xx.1 <-  xx.1[!is.na(xx.1[, 4]), ] }

        if(xx.b.1[4] == "0") { xx.1 <- xx.1[is.na(xx.1[, 5]), ] }
        else { xx.1 <-  xx.1[!is.na(xx.1[, 5]), ] }

        chipC <-  paste(paste(cate.n, collapse = "#"), xx.b, sep = "***")

        if (dim(xx.1)[1] == 0) 
        {
            xx.2 <- list(genes = dim(xx.1)[1], chipC = chipC, chipCN = i, detailChipS = xx.1, shortL = data.frame(genes = "noInteraction", cl = i, fullCl = chipC))
        }
        else
        {
            xx.2 <- list(genes = dim(xx.1)[1], chipC = chipC, chipCN = i, detailChipS = xx.1, shortL = data.frame(genes = as.character(xx.1[, 1]), cl = i, fullCl = chipC))
        }
        vennItems <- c(vennItems, list(xx.2))
    }

    vennItems
}

xx.3 <- ff.vennFourItems(xx.2)
str(xx.3)
List of 15
 $ :List of 5
  ..$ genes      : int 1
  ..$ chipC      : chr "A#B#C#D***0001"
  ..$ chipCN     : int 1
  ..$ detailChipS:'data.frame': 1 obs. of  5 variables:
  .. ..$ names: Factor w/ 25 levels "A","B","E","F",..: 25
  .. ..$ A    : num NA
  .. ..$ B    : num NA
  .. ..$ C    : num NA
  .. ..$ D    : num 1
  ..$ shortL     :'data.frame': 1 obs. of  3 variables:
  .. ..$ genes : Factor w/ 1 level "Z": 1
  .. ..$ cl    : int 1
  .. ..$ fullCl: Factor w/ 1 level "A#B#C#D***0001": 1
 $ :List of 5
  ..$ genes      : int 0
  ..$ chipC      : chr "A#B#C#D***0010"
  ..$ chipCN     : int 2

看一眼?intersect, ?union and ?setdiff函数提取维恩图的不同字段。

我已经创建了一些list这两个函数的版本可以更好地获取不同隔间中的元素:

Intersect <- function (x) {  
  # Multiple set version of intersect
  # x is a list
  if (length(x) == 1) {
    unlist(x)
  } else if (length(x) == 2) {
    intersect(x[[1]], x[[2]])
  } else if (length(x) > 2){
    intersect(x[[1]], Intersect(x[-1]))
  }
}

Union <- function (x) {  
  # Multiple set version of union
  # x is a list
  if (length(x) == 1) {
    unlist(x)
  } else if (length(x) == 2) {
    union(x[[1]], x[[2]])
  } else if (length(x) > 2) {
    union(x[[1]], Union(x[-1]))
  }
}

Setdiff <- function (x, y) {
  # Remove the union of the y's from the common x's. 
  # x and y are lists of characters.
  xx <- Intersect(x)
  yy <- Union(y)
  setdiff(xx, yy)
}

因此,如果我们想查看示例中的公共元素(即 A、B、C 和 D 的并集)或 C 和 D 中的元素,但不包括 A 和 B 中的元素,我们会执行以下操作。

set.seed(1)
xx.1 <- list(A = sample(LETTERS, 15), 
             B = sample(LETTERS, 15), 
             C = sample(LETTERS, 15), 
             D = sample(LETTERS, 15))
Intersect(xx.1)
#[1] "E" "L"
Setdiff(xx.1[c("C", "D")], xx.1[c("A", "B")])
#[1] "O" "P" "K" "H"

希望这可以帮助!

编辑:系统地获取所有组件

通过一些(我认为)巧妙的使用combn函数、索引以及对lapply我们可以系统地分析所有元素:

# Create a list of all the combinations
combs <- 
  unlist(lapply(1:length(xx.1), 
                function(j) combn(names(xx.1), j, simplify = FALSE)),
         recursive = FALSE)
names(combs) <- sapply(combs, function(i) paste0(i, collapse = ""))
str(combs)
#List of 15
# $ A   : chr "A"
# $ B   : chr "B"
# $ C   : chr "C"
# $ D   : chr "D"
# $ AB  : chr [1:2] "A" "B"
# $ AC  : chr [1:2] "A" "C"
# $ AD  : chr [1:2] "A" "D"
# $ BC  : chr [1:2] "B" "C"
# $ BD  : chr [1:2] "B" "D"
# $ CD  : chr [1:2] "C" "D"
# $ ABC : chr [1:3] "A" "B" "C"
# $ ABD : chr [1:3] "A" "B" "D"
# $ ACD : chr [1:3] "A" "C" "D"
# $ BCD : chr [1:3] "B" "C" "D"
# $ ABCD: chr [1:4] "A" "B" "C" "D"

# "A" means "everything in A minus all others"
# "A", "B" means "everything in "A" and "B" minus all others" and so on
elements <- 
  lapply(combs, function(i) Setdiff(xx.1[i], xx.1[setdiff(names(xx.1), i)]))

n.elements <- sapply(elements, length)
print(n.elements)
#   A    B    C    D   AB   AC   AD   BC   BD   CD  ABC  ABD  ACD  BCD ABCD 
#   2    2    0    0    1    2    2    0    3    4    4    1    1    2    2 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取维恩图中的项目列表 的相关文章

随机推荐

  • 从 .h5 文件加载权重时出现 Tensorflow 2.0 ValueError

    我有一个VAE架构脚本如下 import numpy as np import tensorflow as tf from tensorflow keras layers import Input Conv2D Flatten Dense
  • 从 Laravel 访问查询字符串值

    有谁知道是否可以在 Laravel 中使用 URL 查询 Example 我有以下路线 Route get text TextController index 该页面上的文本基于以下 url 查询 http example com text
  • 有没有更简单的方法来比较文件版本?

    我编写了一个函数来比较客户端当前拥有的文件版本和服务器上文件的最新版本之间的文件版本 客户端将 quad Major Minor Build Private 版本号作为字符串传递给服务器 然后服务器使用 FileVersionInfo cl
  • 获取某个 UITableViewCell 的屏幕坐标?

    所以 我有这个UITableView 它位于 iPad 应用程序中 有些单元格的右侧有一个附件按钮 小圆形箭头 当按下该按钮时 我会呈现一个弹出视图 用户可以在其中选择与他们触摸的表格单元格相关的操作 到目前为止 这一切都不是困难的或特殊的
  • 如何在不使用 setInterval/timeout 的情况下检查实时更新?

    建立一个社交网络 我正在尝试获取实时通知 目前 站点使用 setInterval 每隔几秒发送一次 AJAX 请求 它看起来像这样 setInterval function url base dir ajax file php data d
  • 如果 CSS3 过渡不存在,使用 Modernizr 和 jQuery 制作动画

    如果不支持 CSS3 有没有办法结合使用 Modernizr 和 jQuery 来启用类似于过渡的功能 我目前正在做的事情是这样的 div class hoverable p This div changes both width and
  • 交互式过渡非线性

    我正在玩自定义和交互式视图控制器转换 UIPercentDrivenInteractiveTransition 我正在构建一个以模式方式呈现卡片 其他视图控制器 的应用程序 我已经进行了自定义转换UIViewControllerAnimat
  • 使用 MySQL 和 PHP 在 HTML 中创建动态表

    我看过很多关于如何使用 PHP 和 MySQL 在 HTML 中构建表的帖子 但我经常在创建表后更改 SQL 列的标题 PHP 有什么方法可以自动更新代码 这样我只需输入表名 它就会打印表 而无需输入所有内容 th tags th
  • 如何通过名称获取控件名称?

    我有一个简单的功能 其中有一个组合框 如果组合框的值等于 禁用 我将禁用文本框 B 有许多组合框及其相应的文本框 B 按行排列并手动命名 如果组合框 A 被命名为Product1 文本框B将被命名Product1 status 我在想这样的
  • 如何在数据库android中存储图像[重复]

    这个问题在这里已经有答案了 我是 android 新手 我正在创建一个联系人管理器 我已经弄清楚如何将 EditText 字段中的值存储到数据库中 但我不知道如何在数据库中存储图像 我想知道是否有人可以帮助我解决这个问题 package a
  • JavaMail BaseEncode64 错误

    我目前正在开发一个从 gmail 帐户下载附件的应用程序 现在 每次下载压缩附件时都会出错 但是 并非全部 有些我可以毫无错误地检索它 这是异常消息 Exception in thread main com sun mail util De
  • 根据键值删除日期早于所需日期点的行

    我有一个 pd dataframe 如下所示 key value date value 01 2017 01 13 value 01 2018 02 17 value 01 2018 04 02 value 01 2018 05 13 va
  • iOS 7 -- navigationController 正在设置我的 UIScrollView 的 contentInset 和 ContentOffset

    我有一个 UIScrollView 实际上是一个 UICollectionView 但这可能并不重要 当它出现在 IOS 7 中时 导航控制器将其 contentInset 和 contentOffset 设置为我不想要的值 它似乎正在尝试
  • Rails 格式验证——字母数字,但不是纯数字

    测试用户名格式验证的最佳方法是什么 使用字母数字的正则表达式 但不是纯数字 我一直在我的模型中使用以下验证 validates username format gt with gt a z0 9 a z0 9 a z0 9 i 数字用户名
  • 如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?

    我想从使用加载的 YAML 文件中获取注释字符串ruamel yaml The 项目文件缺少 API 参考 我找不到相关示例 访问评论的正确方式是什么 import ruamel yaml yaml YAML 1 2 C1 a C2 C3
  • Python string.join ( list ) 最后一个条目带有“and”

    有什么优雅的方法可以连接句子部分列表 使结果为 a b 和 c 其中list is a b c 简单指定 join 仅实现 a b c 另外 我确实对此进行了一些搜索 但显然我没有尝试编写短语 因为除了自己枚举列表之外 我还没有想出任何东西
  • 如何在 Javascript 中提取本地图像的元数据?

    我想获取用户拖放到网页中的图像的元数据 我已经设置了拖放功能 但是 图像实际上并未上传到服务器 它是在本地访问的 我仍然可以使用 Javascript 从图像中获取元数据吗 如果是这样 我该怎么做 有哪些好的图书馆 如果没有 我是否必须上传
  • 如何从 C# 中的二维数组中删除行和列?

    如何在 C 中删除二维数组中的特定行和列 int array 1 2 3 4 5 6 7 8 9 假设我想删除第 i 行和第 i 列 跳过它们 对于 nXn 数组而不仅仅是 3x3 并将剩余的数组存储在新数组中 所以输出将是 5 6 8 9
  • 有没有办法检查两个数组是否具有相同的元素?

    假设我有 2 个数组 firstArray 1 2 3 4 5 secondArray 5 4 3 2 1 我想知道它们是否包含相同的元素 而顺序并不重要 我知道我可以编写一个函数对它们进行排序 然后循环遍历它们进行检查 但是是否有为此预先
  • 获取维恩图中的项目列表

    使用以下代码很容易绘制维恩图 library VennDiagram set seed 1 For reproducibility of results xx 1 lt list A sample LETTERS 15 B sample L