【问题标题】:Determining overlap and subsets of multiple data frames in R在 R 中确定多个数据帧的重叠和子集
【发布时间】:2016-03-08 15:52:12
【问题描述】:

我有六组不同的数据,每组都是大约 10,000 行或更大且有两列的数据框。一列包含峰值名称,例如“peak_1”,另一列包含频率。其中一些数据帧包含相同的峰值,而有些则不包含。我的目标是找出这六个数据帧的哪些重叠子集中的峰值(6 个数据集有 63 种不同的可能组合)。我找到了可以找到维恩图子集(这是我正在寻找的)的包,但不适用于 6 个数据集,我尝试使用 %in%which,但是由于我的数据集的大小,我遇到了障碍我想不通。我试图通过将文件合并到所有可能的组合中手动确定它,然后根据文件的大小手动计算每个子集的大小,但我似乎在那里犯了错误,我需要知道每个子集中包含什么,而不仅仅是大小。

例子:

dataA             dataB            dataC
V1      V2        V1       V2      V1       V2
peak1   3         peak2    1       peak1    1
peak2   1         peak3    2       peak4    3
peak5   2         peak4    1       peak6    1
peak8   1         peak8    2       peak8    4
peak9   2

这是我希望达到的结果,其中 dataX 是一个不同的数据框(或类似的东西......我至少需要有可以保存为文件的新表)

dataA       dataB       dataC      dataAB      dataAC      dataBC      dataABC   
V1    V2    V1    V2    V1    V2   V1     V2   V1     V2   V1    V2    V1    V2
peak5 2     peak3 2     peak6 1    peak2  2    peak1  4    peak4 4     peak8 7
peak9 2

我知道这是冗长的,但任何建议都将受到欢迎,因为它看起来应该比我做的更直接!

【问题讨论】:

  • 我最初的直觉反应是首先使用dplyr::bind_rows(..., .id="source") 创建一个大数据框。然后,您可以生成各种交叉表,以深入了解不同峰值的来源和出现。使用这样的“主数据框”,您可以为either data source A or data source B 创建一个附加指标,并在进一步处理中使用它。
  • 一个问题当然是您想要的输出实际上有点不清楚。例如,在您的dataA 列中,所有其他未列出的值发生了什么变化?是什么导致它们被丢弃?
  • 看起来是个不明智的方向。最好将它们 rbind 并使用长格式。

标签: r dataframe subset venn-diagram


【解决方案1】:

假设您正在为V1 的每个级别寻找V2 的最大值,并且要知道它来自哪个data.frame,您可以使用以下命令:

library(dplyr)

# add a row to each with its name so there's a record after the join
dataA$df <- 'dataA'
dataB$df <- 'dataB'
dataC$df <- 'dataC'

# use dplyr version of rbind (use regular, if you prefer)
alldata <- bind_rows(dataA, dataB, dataC)

# dplyr chain that groups by V1 (peak), then chops to rows where V2 is equal 
# to its max for each group, then arrange by peak so it's pretty
alldata %>% group_by(V1) %>% filter(V2 == max(V2)) %>% arrange(V1)

返回

Source: local data frame [9 x 3]
Groups: V1 [8]

     V1    V2    df
  (chr) (int) (chr)
1 peak1     3 dataA
2 peak2     1 dataA
3 peak2     1 dataB
4 peak3     2 dataB
5 peak4     3 dataC
6 peak5     2 dataA
7 peak6     1 dataC
8 peak8     4 dataC
9 peak9     2 dataA

请注意,目前peak2 有两个最大值,这两个都是通过这种方法选择的。


数据:

dataA <- structure(list(V1 = structure(1:5, .Label = c("peak1", "peak2", 
"peak5", "peak8", "peak9"), class = "factor"), V2 = c(3L, 1L, 
2L, 1L, 2L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-5L))

dataB <- structure(list(V1 = structure(2:5, .Label = c("", "peak2", "peak3", 
"peak4", "peak8"), class = "factor"), V2 = c(1L, 2L, 1L, 2L)), .Names = c("V1", 
"V2"), class = "data.frame", row.names = c(NA, 4L))

dataC <- structure(list(V1 = structure(2:5, .Label = c("", "peak1", "peak4", 
"peak6", "peak8"), class = "factor"), V2 = c(1L, 3L, 1L, 4L)), .Names = c("V1", 
"V2"), class = "data.frame", row.names = c(NA, 4L))

【讨论】:

    【解决方案2】:

    使用 alistaire 的数据:

    dl <- do.call(rbind, list(dataA,dataB,dataC))
    # make a source indicator
    unlist(mapply(rep, 1:3, sapply(list(dataA,dataB,dataC), NROW) ) )
     [1] 1 1 1 1 1 2 2 2 2 3 3 3 3
    dl$source= unlist(mapply(rep, 1:3, sapply(list(dataA,dataB,dataC), NROW) ) )
    

    现在可以通过以下方式识别哪些 V1 具有特定模式:

    > table(dl$V1, dl$source)
    
            1 2 3
      peak1 1 0 1
      peak2 1 1 0
      peak5 1 0 0
      peak8 1 1 1
      peak9 1 0 0
            0 0 0
      peak3 0 1 0
      peak4 0 1 1
      peak6 0 0 1
    

    所以可以看到'peak8'在所有三个中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      相关资源
      最近更新 更多