2015-05-18 17 views
5

Durante il tentativo di ottenere i dati idonei per l'analisi, non riesco a farlo correttamente. Presumere Ho un set di dati in questa forma:Ricerca di righe comuni in R

df1 

V1 V2df1 
a H 
b Y 
c Y 

df2 

V1 V2df2 
a Y 
j H 
b Y 

e altri tre (5 set di dati di lunghezza diversa ALLtogether). Quello che sto cercando di fare è il seguente. Per prima cosa devo trovare tutti gli elementi comuni dalla prima colonna (V1) - in questo caso quelli sono: a, b. Quindi, in base a questi elementi comuni, sto provando a creare un set di dati unito, in cui i valori di V1 sarebbero comuni a tutti e cinque i set di dati e i valori di altre colonne verrebbero aggiunti nella stessa riga. Quindi, per spiegare con un esempio, mio risultato dovrebbe essere simile a:

V1 V2df1 V2df2 
a H  Y 
b Y  Y 

sono riuscito ad ottenere un certo codice funziona, ma apperently i risultati non sono corretti. Quello che ho fatto: leggere tutte le righe di tutti i file in variabili (esempio: a<-df1[,1] e così via) e trovare le righe comuni, come:

red<-Reduce(intersect, list(a,b,c,d,e)) 

poi filtrato set di dati specifici come:

df1 <- unique(filter(df1, V1 %in% red)) 

I ordinate ogni set di dati secondo riga:

df1<-data.frame(df1[with(df1, order(V1)),]) 

e cancellate duplicati (di elementi in prima colonna):

df1<- df1[unique(df1$V1),] 

Ho poi creato un nuovo set di dati con:

newdata<-data.frame(V1common=df1[,1], V2df1=df1[,2],V2df2=df2[,2]...) 

... significa che per tutti e cinque set di dati. In realtà ho ottenuto lo stesso numero di righe (un buon segno dato che ci sono lo stesso numero di righe all'interno dell'intersezione) e poi ho aggiunto altre colonne ordinate, ma qualcosa non si sommava. Grazie per qualsiasi consiglio. (Ho omesso l'uso di librerie e simili, il codice è a scopo illustrativo).

+3

See '? Merge'. Immagino che 'unire (df1, df2)' sia quello che stai cercando. – nicola

+0

Generalmente buone prassi includere anche la menzione delle librerie, credo. Ad esempio, la gente R potrebbe non sapere 'filtro' (a parte la funzione delle serie temporali nella base R). – Frank

+0

Idea nicolas espandibile, per più set di dati, utilizzare 'Riduci' con' unione ', cioè 'Riduci (funzione (...) unione (..., per =' V1 '), mget (incolla0 (' df ', 1 : 5))) ' – akrun

risposta

7

È possibile utilizzare join_all da plyr pacchetto

require(plyr) 
df <- join_all(list(df1,df2,df3,df4, df5), by = 'V1', type = 'inner') 
+0

Questo è esattamente quello che stavo cercando. Posso aderire anche a più di un criterio? Ad esempio V1 e V2, se ci sono 3 colonne? –

+0

Sì, è possibile. Prova a usare qualcosa come by = c ('V1', 'V2') – BICube

Problemi correlati