2017-02-15 9 views
0

I einen Datenframe dfu haben, die für jede id hält (ID team gehört zu, team viele ids hat) den Prozentsatz Proben, bei denen eine Reihe von Eigenschaften prop1, prop2 und so weiter beobachtet werden, basierend Bei einigen früheren Studien wird dies als eine Art Referenztabelle für zukünftige Studien verwendet. Jetzt gibt es Daten von einem neuen Experiment, das einen neuen Satz von ids ergibt. Ich muss die prozentualen Proben finden, wobei prop1, prop2 usw. auf team Basis unter Verwendung der Referenzdaten in dfu beobachtet werden. Dies könnte durch Zählen der Anzahl von Vorkommen pro id in dfi und nehmen dann einen gewichteten Durchschnitt von team gruppiert erfolgen .- nicht alle IDs in dfu vorhanden sein können und ein oder mehrere IDs nicht in dfu in dfi vorhanden sein können. Die in dfu nicht vorhandenen IDs können vom gewichteten Durchschnitt ausgeschlossen werden, da für sie keine Anwesenheit pro Eigenschaftswerte verfügbar ist.gelten Verteilung auf neue Abtastsatz

dfu <- data.frame(id=1:6, team=c('A',"B","C","A","A","C"), prop1=c(0.8,0.9,0.6,0.5,0.8,0.9), prop2=c(0.2,0.3,.3,.2,.2,.3)) 
> dfu 
    id team prop1 prop2 
    1 A 0.8 0.2 
    2 B 0.9 0.3 
    3 C 0.6 0.3 
    4 A 0.5 0.2 
    5 A 0.8 0.2 
    6 C 0.9 0.3 
> 
> dfi <- data.frame(id=c(2 , 3 , 2 , 1 , 4 , 3 , 7)) 
> dfi 
    id 
    2 
    3 
    2 
    1 
    4 
    3 
    7 

Das Ausgabeformat wäre wie folgt. Zum Beispiel wäre der Wert für prop1 für die Gruppe A(0.8*1 + 0.5*1)/2 = 0.65.

bevorzugen Basis R-Ansatz, andere Ansätze willkommen. Die Anzahl der Spalten könnte viele sein.

+0

ähnliche Frage hier - http://stackoverflow.com/q/42105259/3206440, kann sei ein spezifischer Fall. – user3206440

+1

Ich vermute, dass Ihre set.seed (100) nicht den Daten entspricht. – DJJ

Antwort

1

Ich weiß nicht genau, wie es mit der Basis R. sollte es

Mit data.table zu tun ziemlich einfach sein. Konvertieren Sie Ihre data.frames in data.table.

library(data.table) 

dfu <- data.frame(id=1:6, team=c('A',"B","C","A","A","C"), prop1=c(0.8,0.9,0.6,0.5,0.8,0.9), prop2=c(0.2,0.3,.3,.2,.2,.3)) 

dfi <- data.frame(id=c(2 , 3 , 2 , 1 , 4 , 3 , 7)) 
dfi <- data.table(dfi) 
dfu <- data.table(dfu) 

sie dann verschmelzen wie

dfu[dfi,on="id"] 

## > dfu[dfi,on="id"]     
## id team prop1 prop2 
## 1: 2 B 0.9 0.3 
## 2: 3 C 0.6 0.3 
## 3: 2 B 0.9 0.3 
## 4: 1 A 0.8 0.2 
## 5: 4 A 0.5 0.2 
## 6: 3 C 0.6 0.3 
## 7: 7 NA NA NA 

Führen Sie dann müssen wir nur den Mittelwert von Gruppe. In der Tat können wir es Einzeiler wie

dfu[dfi,on="id"][,mean(prop1),team] 

## > dfu[dfi,on="id"][,mean(prop1),team] 
## team V1 
## 1: B 0.90 
## 2: C 0.60 
## 3: A 0.65 
## 4: NA NA 

Sie können die gleiche Sache in der Basis R erreichen, indem die data.frame Zusammenführung und mit der Funktion aggregate, denke ich.

1

nehmend Stichwort von @ DJJ's Antwort.

dfu <- data.frame(id=1:6, team=c('A',"B","C","A","A","C"), 
      prop1=c(0.8,0.9,0.6,0.5,0.8,0.9), 
      prop2=c(0.2,0.3,.3,.2,.2,.3)) 
dfi <- data.frame(id=c(2 , 3 , 2 , 1 , 4 , 3 , 7)) 

Merge von id

> dfx <- merge(dfi, dfu, by="id") 
> dfx 
    id team prop1 prop2 
1 1 A 0.8 0.2 
2 2 B 0.9 0.3 
3 2 B 0.9 0.3 
4 3 C 0.6 0.3 
5 3 C 0.6 0.3 
6 4 A 0.5 0.2 

Aggregate prop1 und prop2 von team mit mean

> aggregate(cbind(prop1, prop2) ~ team, dfx, mean) 
    team prop1 prop2 
1 A 0.65 0.2 
2 B 0.90 0.3 
3 C 0.60 0.3