2016-04-25 31 views
0

Ich habe einen Datenrahmen, der unter seinen Spalten eine Person (Pid) und Standort Spalten sind. Ich versuche, die Daten so zu unterteilen, dass wenn eine Personen-ID mehr als 67 Mal vorkommt, ich eine Teilmenge der Daten basierend auf dem Ort, an dem die Instanzen der Person vorkommen, nehme und dann eine Reihe von Regressionen für diese Teilmenge anwende.Problem Subsetting r Datenrahmen

Ich weiß, wie man jeden, der diese 67 Schwelle (mit table(), um die Anzahl der PID erhalten) bekommen, aber wie bekomme ich dann eine Teilmenge des Datenrahmens basierend auf ihrem Standort nicht zu wissen, wo der Ort ist? Der Datenrahmen hat ungefähr 100.000 Reihen mit 400 Leuten, die diese 67 Markierung schlagen, also tut es von Hand praktisch nicht.

Ich weiß nicht, wie man ein Beispieldatenset meiner Daten hier anbringt, aber es sieht ungefähr so ​​aus. Wenn also zum Beispiel pid value 1 200 mal wiederholt wird, würde ich gerne den gesamten Datenrahmen, der den Standortwert '6' hat, unabhängig von der pid unterteilen. Ähnlich für pid 3 - Ich möchte alle Zeilen, wo die Position '1' ist. Der einzige Haken ist, dass ein Pid manchmal mehr als einen Standort hat. Die Mehrheit wird sich an einem bestimmten Ort befinden - also gibt es bei pid 3 den Ort 1 und den Ort 2. In diesem Fall würde ich den Ort, der die Mehrheit hat, unterteilen wollen.

pid  location 
1  6 
1  6 
1  6 
2  4 
2  6 
3  1 
3  2 
3  1 

Beispieldaten

set.seed(1) 
pid <- sample(1:10, 1000, replace=T) 
location <- sample(1:10, replace=T) 
df <- data.frame(pid, location) 

Edits: Ok - Was ich versuche zu tun, jeden Pid erhalten, die mehr als 66-mal wiederholt. Sobald ich diese Liste habe, möchte ich dann sehen, an welchem ​​Ort sie aufgetreten sind. Dann möchte ich eine Reihe von Regressionen auf einer Teilmenge des gesamten Datenrahmens ausführen. Also - wenn Pid 1 500 mal vorkommt, und sie in Position 6 auftraten, möchte ich den Datenrahmen für die Position 6 unterteilen, eine Dummy-Variable für Pid 1 erstellen und eine Reihe von Regressionen für diese Teilmenge von Position 6 ausführen (andere Regressionsvariablen nicht enthalten) in diesem Beispiel). Es gibt 1272 eindeutige PID im Datenrahmen. Ich konnte die Antwort von Ano verwenden, um zu bekommen, wonach ich suchte, aber am Ende habe ich es etwas anders gemacht. Es schien einfacher (zumindest konzeptionell für mich), zuerst die Daten nach Ort zu unterteilen, dann die PIDs zu erhalten, die sich mehr als 66 Mal wiederholen und meine Regressionen ausführen. Das beseitigte jegliche Sorge um Pid's, die mehr als einen Ort haben. Aber ich bin ziemlich neu für r, ich bin offen für andere Vorschläge, was wäre ein besserer Weg, um es zu kodieren. Hoffentlich klärt das ein wenig auf.

+1

Sie sollten klären, wie Ihre gewünschte Ausgabe aussieht. – Frank

+0

warte - Ich weiß, dass ich neu bei stackoverflow bin, aber warum wird ein Beitrag auf Eis gelegt, nachdem eine Antwort bereits akzeptiert wurde? Ich werde Post jetzt bearbeiten, um es hoffentlich verständlicher zu machen. – MikeD

+2

Sie haben fünf Antworten erhalten, von denen drei von ihren Autoren gelöscht wurden, weil sie erkannten, dass sie nicht sicher waren, wonach Sie suchten. Die Tatsache, dass die angenommene Antwort Ihre Absicht richtig erkannt hat, verbessert die Frage in dieser Hinsicht nicht.Vielleicht verdient es, jetzt wieder geöffnet zu werden, dass Sie eine weitere Wand des Textes hinzugefügt haben, aber ich sehe den Punkt nicht. Ich würde sagen, versuchen Sie einfach, das nächste Mal, wenn Sie eine Frage stellen, klarer zu sein. – Frank

Antwort

1

Diese Lösung verwendet dplyr.

library(dplyr) 

Gruppe die Daten von PID, zählen, wie viele Instanzen gibt diesen PID ist, filtern diejenigen aus, die zu erreichen, was Schwellen Sie interessiert sind und wählen Sie dann wählen Sie die verschiedenen PIDs

foo <- df %>% 
    group_by(pid) %>% 
    filter(n() >= 67 & max(n() == n())) %>% 
    distinct(pid) %>% 
    .$pid 

verwenden, die neu erzeugte Vektor ursprünglichen Datenrahmen und wählen Sie die einzigartige location s

unique(df[df$pid %in% foo,"location"]) 
+0

Für den zweiten Teil, sie wollen nur einen Ort pro Pid, ​​klingt wie. – Frank

+1

haben es geschafft. ein 'filter (count == max (count))', ich denke, dass sollte es tun – ano

+1

Es gibt keine Notwendigkeit muate, wir können Filter zusammen, die letzten 2 Zeilen können mit '. $ pid' ersetzt werden ... – zx8754

0

Hier ist eine Möglichkeit, ohne den Einsatz vonder Teilmenge 210:

df.freq <- addmargins(table(df), margin = 2) 
df.freq <- subset(df.freq, 'Sum' > 67, select = -Sum) 

df.max <- apply(df.freq, 1, function(x) { 
    names(x)[which(x == max(x))] }) 
df.max <- unique(as.numeric(df.max)) 
subset(df, location %in% df.max)