2016-03-04 66 views
1

我有六组不同的数据,每一组数据都是大约10,000行或更大的数据框,并且有两列。一列包含峰名称,如“peak_1”,另一列包含频率。其中一些数据帧包含相同的峰值,有些不。我的目标是找出哪些峰在哪些重叠的这六个数据框的子集(有6个数据集有63个不同的可能组合)。我发现可以找出维恩图子集(这是我正在寻找的)的包,但不是为6数据集,我已经尝试使用%in%which,但随着我的数据集的大小我碰到路障,我无法图出。我试图通过将文件合并成所有可能的组合来手动确定它,然后根据文件的大小手动计算每个子集的大小,但是我似乎在那里采取了失误,并且我需要知道每个子集中包含的内容,而不仅仅是大小。确定R中多个数据帧的重叠和子集

例子:

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 

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

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 

我知道这是啰嗦,但是任何建议将受到欢迎,因为它似乎喜欢的事,应该是更直接的比我做吧!

+0

我最初的反应是首先使用'dplyr :: bind_rows(...,.id =“source”)创建一个大数据框。然后,您可以生成各种交叉表述,以了解不同峰的来源和发生情况。使用这种“主数据框”,您可以为“数据源A”或“数据源B”创建附加指示符,并在进一步处理中使用该指示符。 – coffeinjunky

+0

其中一个问题当然是您的理想输出实际上有点不清楚。例如,在你的'dataA'列中,所有其他值都没有被列出来呢?是什么导致他们被抛弃? – coffeinjunky

+0

看起来像一个不明智的方向。更好的办法是把他们打包并用长形式工作。 –

回答

1

假设你正在寻找最大的V2V1每个级别,并知道什么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)) 
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 

所以可以看到“峰值8'全部三个。