确定R中多个数据帧的重叠和子集
问题描述:
我有六组不同的数据,每一组数据都是大约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
我知道这是啰嗦,但是任何建议将受到欢迎,因为它似乎喜欢的事,应该是更直接的比我做吧!
答
假设你正在寻找最大的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))
答
使用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'全部三个。
我最初的反应是首先使用'dplyr :: bind_rows(...,.id =“source”)创建一个大数据框。然后,您可以生成各种交叉表述,以了解不同峰的来源和发生情况。使用这种“主数据框”,您可以为“数据源A”或“数据源B”创建附加指示符,并在进一步处理中使用该指示符。 – coffeinjunky
其中一个问题当然是您的理想输出实际上有点不清楚。例如,在你的'dataA'列中,所有其他值都没有被列出来呢?是什么导致他们被抛弃? – coffeinjunky
看起来像一个不明智的方向。更好的办法是把他们打包并用长形式工作。 –