确定R中多个数据帧的重叠和子集

时间:2016-03-04 23:13:45

标签: r dataframe subset venn-diagram

我有六组不同的数据,每组数据都是大约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

我知道这是啰嗦,但任何建议都会受到欢迎,因为它似乎应该比我做得更直接!

2 个答案:

答案 0 :(得分:1)

假设您正在为V2的每个级别寻找V1的最大值,并且知道它来自哪个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))

答案 1 :(得分:0)

使用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

所以可以看到&#39; peak8&#39;这三个都是。