2016-04-07 24 views
3

Ich bin relativ neu in R und ich versuche, einen Datenrahmen nach Jahr und spezifischen Spaltennummern zu filtern. Hier ist ein Spielzeug Beispiel meiner Datensatz:Filter nach Jahr und Spaltennummer in R

Year UniqueID  Bench.St SiteEUI 
2011  1    Yes  450 
2011  2    No  300 
2011  3    No   NA 
2011  4    NA  350 
2012  1    No  400 
2012  2    Yes  200 
2013  1    Yes  500 
2013  2    No  100 
2013  3    Yes  475 

Ich versuche, die Reihen zu extrahieren, die Informationen von 2011 bis 2013 durch die UniqueIDs sortiert wiederholt haben. Im obigen Beispiel hat 2011 4 UniqueIDs (1,2,3,4), 2012 2 UniqueIDs (1,2) und 2013 3 UniqueIDs (1,2,3). Da UniqueIDs 1 und 2 in den drei Jahren vorhanden sind, möchte ich die UniqueID-Zeilen für diese Jahre extrahieren. Daher oberhalb der Datensatz reduziert sich auf:

Year UniqueID  Bench.St  SiteEUI 
2011  1    Yes    450 
2011  2    No    300 
2012  1    No    400 
2012  2    Yes    200 
2013  1    Yes    500 
2013  2    No    100  

ich, dass dplyr oder eine andere einfache Funktion glauben Lage sein kann, dies zu tun, aber ich bin nicht sicher, wie es geht. Vielen Dank!

Antwort

2

Ich denke, was Sie fragen, ist, wie Sie die Menge der Beobachtungseinheiten, die in allen Jahren Ihrer Daten vorhanden sind extrahieren. Hier ist ein Verfahren unter Verwendung einer Base R für einen data.frame namens dataSet:

# get a table of the frequency counts of each ID 
idCount <- table(dataSet$uniqueIDs) 
# keep the IDs (converted back to integers) that have the most counts 
keepIDs <- as.integer(names(idCount))[idCount == max(idCount)] 
# save the new data set that includes those IDs 
newDataSet <- dataSet[dataSet$uniqueIDs %in% keepIDs,] 
+0

In Ihrer zweiten Zeile Code @Imo fehlt ein ")". Nichtsdestotrotz ist dies eine aufwendige Lösung! – fdetsch

+0

Danke @Imo, das war wirklich hilfreich. Ich denke keepIDs <- as.integer (Namen (idCount) [idCount == max (idCount)] (Namen (idCount) hat eine fehlende ")", aber es funktionierte, nachdem ich die) hinzugefügt. –

+0

Danke für den Fang, @fdetsch. Ich habe den Schnitt gemacht. – lmo

1

Sie können den Datensatz von Jahren split und die daraus resultierenden jährlichen Listeneinträge mischen wieder zusammen merge zusammen mit all = FALSE (default) verwendet wird. Auf diese Weise erhalten Sie die Werte für "uniqueID", die in allen untersuchten Jahren bestehen.

## sample data 
dat <- data.frame(Year = c(rep(2011, 4), rep(2012, 2), rep(2013, 3)), 
        UniqueID = c(1, 2, 3, 4, 1, 2, 1, 2, 3), 
        Bench.St = c("Yes", "No", "No", NA, "No", "Yes", "Yes", "No", "Yes"), 
        SiteEUI = c(450, 300, NA, 350, 400, 200, 500, 100, 475)) 

## split data by year and merge by 'uniqueID', discard non-matching entries 
lst <- split(dat, dat$Year) 

mrg <- Reduce(function(...) merge(..., by = "UniqueID"), lst) 

## subset data based on remaining values of 'uniqueID' 
dat[dat$UniqueID %in% mrg$UniqueID, ] 

    Year UniqueID Bench.St SiteEUI 
1 2011  1  Yes  450 
2 2011  2  No  300 
5 2012  1  No  400 
6 2012  2  Yes  200 
7 2013  1  Yes  500 
8 2013  2  No  100 
+0

Vielen Dank @fdetsch, das hat funktioniert !! Dies ist meine erste Veröffentlichung und ich wusste nicht, dass ich so schnell eine Antwort bekommen würde. –

+0

Sie sollten in Betracht ziehen, eine Antwort dann @TobiAdekanye zu akzeptieren ;-) froh zu helfen! – fdetsch

+0

Ich erkannte, dass während der Code für einen kleinen Datensatz, für einen größeren Datensatz von etwa 50.000 Zeilen und 28 Spalten funktionierte, die Zusammenführungsfunktion eine Warnung anzeigt. Ich habe ungefähr 4000 Reihen in Jahr 1, 15000 in Jahr 2, 170000 in Jahr 3 und 13,000 in Jahr 4. Ich erwartete ungefähr 2000 Reihen aber Ergebnisse von fast 14000 Reihen erhalten. Hast du eine Idee was falsch ist? –