2016-03-04 1 views
1

J'ai six ensembles de données différents, dont chacun est des trames de données d'environ 10 000 lignes ou plus et comportant deux colonnes. Une colonne contient des noms de pic, tels que "peak_1", l'autre la fréquence. Certaines de ces trames de données contiennent les mêmes pics, et d'autres non. Mon objectif est de déterminer quels sont les pics dans lesquels se chevauchent des sous-ensembles de ces six bases de données (il y a 63 différentes combinaisons possibles avec 6 ensembles de données). J'ai trouvé des paquets qui pourraient trouver des sous-ensembles de diagrammes venn (ce que je cherche), mais pas pour 6 jeux de données, et j'ai essayé d'utiliser %in% et which, mais avec la taille de mes jeux de données je frappais des obstacles que je ne pouvais pas comprendre en dehors. J'ai essayé de le déterminer à la main en fusionnant les fichiers dans toutes les combinaisons possibles puis en calculant manuellement la taille de chaque sous-ensemble à partir de la taille des fichiers, mais il semble que j'ai pris des erreurs et j'ai besoin de savoir ce que contient chaque sous-ensemble et pas seulement la tailleDétermination du chevauchement et des sous-ensembles de plusieurs trames de données dans R

Exemple:

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 

Ceci est le résultat j'espère réaliser, où Datax est un autre dataframe (ou quelque chose de similaire ... Je dois au moins avoir de nouvelles tables je peux enregistrer en tant que fichiers)

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 

je sais que ce fut de longue haleine, mais toutes les suggestions seront les bienvenues, car il semble que quelque chose qui devrait être beaucoup plus droite avant que je ne fais-le!

+0

Mon premier réflexe est de créer une grande base de données en utilisant 'dplyr :: bind_rows (..., .id =" source ")' en premier. Vous pouvez ensuite générer diverses tableaux croisés pour obtenir des informations sur la source et l'occurrence des différents pics. Avec un tel "master-dataframe", vous pouvez créer un indicateur supplémentaire pour "soit la source de données A, soit la source de données B", et l'utiliser dans un traitement ultérieur. – coffeinjunky

+0

Un problème est bien sûr que votre sortie souhaitée est un peu floue, en fait. Par exemple, dans votre colonne 'dataA', qu'est-ce qui est arrivé à toutes les autres valeurs qui ne sont plus listées? Qu'est-ce qui les a fait tomber? – coffeinjunky

+0

On dirait une direction imprudente. Mieux serait de les lier et de travailler avec la forme longue. –

Répondre

1

En supposant que vous cherchez le maximum pour V2 pour chaque niveau de V1 et de savoir ce que data.frame il est venu, vous pouvez utiliser les éléments suivants:

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) 

qui retourne

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 

Notez qu'il y a deux maximums pour peak2 pour le moment, qui sont tous les deux sélectionnés avec cette approche.


données:

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

Utilisation des données de 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))) 

maintenant peut identifier les V1 de avoir un motif particulier:

> 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 

Alors peut voir que ' peak8 'est dans tous les trois.