我有六组不同的数据,每组数据都是大约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
我知道这是啰嗦,但任何建议都会受到欢迎,因为它似乎应该比我做得更直接!
答案 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;这三个都是。