2017-02-07 1 views
0

Subset Ich habe einen riesigen Datenrahmen mit passenden Fallkontrollpersonen. Der passende Fall: Kontrolle ist 1: 3. Ich versuche, die Case-IDs neu zu berechnen und dann die entsprechenden Steuerelemente zu extrahieren.Wie die gleichen Zeilen/IDs wiederholt in r

Also habe ich einen Vektor von IDs, wo die IDs wiederholt werden können. Ich möchte die Daten für Fälle und Kontrollen für jede ID des Vektors extrahieren. Der Fall und die übereinstimmenden Steuerelemente haben dieselbe case_num. Die% in% übernimmt immer die eindeutigen IDs aus den Daten. Ich habe es getan, um es zu tun. Es dauert etwa 2,5 Sekunden. Gibt es einen anderen effizienten Weg?

Ich bin ein einfaches Beispiel und meine Lösung für die Frage.

In meinem Fall, die Länge des ID-Vektors im Jahr 1921, hat die Funktion die Steuerelemente 1921 mal zu extrahieren. Wenn also die Zeit sogar um eine Sekunde verkürzt werden kann, wird es tatsächlich eine Menge sein, während ich den gesamten Prozess 1000 Mal wiederholen werde. Vielen Dank!

test_data=  

data.frame(id=c(1,1,2,4,4,5,6),value=c('g','e','r','j','a','b','c')) 

test_data 
id value 
1 1  g 
2 1  e 
3 2  r 
4 4  j 
5 4  a 
6 5  b 
7 6  c 



id_vec= c(1,4,1,5) 

library(plyr) 
newdata.list=llply(id_vec, function(x) test_data[test_data$id==x,]) 

## or if we make our data a data.table then 
library(data.table) 
test_data= data.table(test_data) 

newdata.list=llply(id_vec, function(x) test_data[id==x]) 

library(dplyr) 
newdata.frame= bind_rows(newdata.list) ### making it a dataframe 
newdata.frame 
    id value 
1: 1  g 
2: 1  e 
3: 4  j 
4: 4  a 
5: 1  g 
6: 1  e 
7: 5  b 
+0

Pls schreiben die Daten als Text, nicht als Bild. Verwende 'dput (your_data)' und kopiere das Ergebnis. – GGamba

+0

hat die Änderungen, auch die Codes nach dem Erhalten der Kommentare hinzugefügt. –

+0

Wahrscheinlich am sichersten, nicht plyr + dplyr + data.table zu mischen; Besser, nur um zu wählen 1. Plyr wurde im Wesentlichen durch dplyr ersetzt, also wahrscheinlich nicht dieser. – Frank

Antwort

0

Zuerst teilen Sie Ihre Datenrahmen in eine Liste von Datenrahmen für jede ID:

split_data = split(test_data, test_data$id) 

Meine Vermutung ist, dass Sie hier und arbeiten mit dieser Liste, die jeden id getrennt hat aufhören können, aber nur einmal. Wenn Sie jedoch in id_vec müssen Kopien der Daten für jede Wiederholung wirklich nur verwenden Liste Indizierung:

result = split_data[id_vec] 

Dies ist sehr verschwenderisch, wenn am Ende Sie in einen einzigen Datenrahmen rekombinieren. Es beinhaltet das Kopieren der gesamten Daten, wenn wirklich alle Zeilennummern benötigt werden. Wenn ich das richtig verstanden habe, ist Ihr Beispiel schlecht, weil die Fallzahlen in den Daten wiederholt werden, während Ihre Beispieldaten eine eindeutige id s haben. Hier ist eine Möglichkeit, mit wiederholten id s in den Daten und der id_vec Daten sampeln ohne Datenrahmen Kopien zu machen:

## new example data 
test_data2 = data.frame(id=c(1, 1, 2, 3, 3, 4), value=c('g','e','r','j','a','b')) 
id_vec2 = c(3, 1, 2, 3, 4, 1) 

rows = lapply(id_vec2, FUN = function(x) which(test_data2$id == x))  
result = test_data2[unlist(rows), ] 
result 
#  id value 
# 4 3  j 
# 5 3  a 
# 1 1  g 
# 2 1  e 
# 3 2  r 
# 4.1 3  j 
# 5.1 3  a 
# 6 4  b 
# 1.1 1  g 
# 2.1 1  e 
+0

Das funktioniert ganz gut. Du hast Recht, mein Beispiel ist nicht perfekt. Ich werde es bearbeiten. Vielen Dank. –

Verwandte Themen