2016-03-04 65 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'全部三個。