2016-08-03 2 views
0

Ich habe viele Dateien und ich versuche die effizienteste Art zu finden, die Datenrahmen zu lesen und gemeinsame Werte in einer Spalte zu finden.Der effizienteste Weg, gemeinsame Werte für eine Spalte über viele Datenrahmen hinweg zu finden

Denn jetzt habe ich: 1. Ich las eine Liste von Dateien mit:

files = c("test1.txt", "test2.txt", test3.txt") 
my.data <- lapply(files, read.table, header=T) 

jeweils Spalten z.B.

df1 = data.frame(id=c("a", "b", "c"), v = c(1:3), c=c(10:12)) 
df2 = data.frame(id=c("x", "b", "c"), v = c(2:4), c=c(13:15)) 
df3 = data.frame(id=c("a", "n", "c"), v = c(4:6), c=c(16:18)) 

my.data = list(df1, df2, df3) 

Und jetzt versuche ich, die Liste des Datenrahmen der Teilmenge die gleiche Liste von Datenrahmen jeweils nur die gemeinsame Zeilen für die erste Spalte mit dem Namen „id“ zurückzukehren, z.B.

df1, df2, and df3 in this case would be a list containing only "id" common to all read files, i.e. a row with only "c" in this case: 
intersect(intersect(df1$id, df2$id), df3$id); 
list(df1[3,], df2[3,], df3[3,]) 

aber ich kann einen Weg mit Listen nicht herausfinden, alle Datenrahmen fusionieren, vielleicht ist dies ein längerer/schwieriger Prozess als alle Dateien zu lesen, sie alle zuerst durch die gemeinsame Spalte „id“ Verschmelzung, und dann teilen sie in eine Liste von Datenrahmen? Hat jemand einen Einblick für effizienteste Wege? Vielen Dank!

+1

'Reduce (Schnittpunkt, Map (" [[", mein.data," id))] '. Aber es ist keine Liste, nur die Schnittmenge, die allen IDs gemeinsam ist. –

+0

Hallo Richard, danke. das würde die gemeinsame "id" ergeben, aber ich versuche, eine Liste von Datenrahmen mit diesen gemeinsamen IDs zurückzugeben ... – user971102

+0

Meinst du wie 'lapply (meine.daten, funktion (x) x [x $ id% in % Reduzieren (Schnittpunkt, Karte ("[[", mein.data, "id")),]) '? –

Antwort

3

Um die gemeinsame Schnittpunkt der id Spalten finden Sie

common <- Reduce(intersect, Map("[[", my.data, "id")) 

Dann können wir, dass die Listenelemente der Teilmenge verwenden können.

lapply(my.data, function(x) x[x$id %in% common, ]) 
# [[1]] 
# id v c 
# 3 c 3 12 
# 
# [[2]] 
# id v c 
# 3 c 4 15 
# 
# [[3]] 
# id v c 
# 3 c 6 18 
Verwandte Themen