2016-03-18 11 views
4

Ich habe folgende Datenrahmen:dplyr zählen innerhalb Untergruppe

df<-data.frame(Date=rep(x=as.Date(c("2016/01/01", "2016/01/02")),each=12), 
     Group=rep(x=c("G1","G2"),each=6,times=2), 
     ID=rep(c("G1F1","G1F2","G1F3","G1M4","G1M5","G1M6","G2F1","G2F2","G2F3","G2M4","G2M5","G2M6"),times=2), 
     Gender=rep(c("Female","Male"),each=3,times=4), 
     Weight=c(c(100,100,100,100,120,140),rep(c(100,120,140,100,100,100),times=2),c(100,100,100,100,120,140))) 

Ich möchte eine neue Spalte CountComp erstellen, die die Anzahl der gleichen Geschlechts gleichen Gruppenmitglied Zählungen von einzelnen zeigt, deren Gewicht weniger als 10 Gramm ist oberhalb oder unter dem Gewicht des Individuums in jeder Zeile zu einem bestimmten Zeitpunkt festgelegt, wie zu bekommen:

df2<-data.frame(Date=rep(x=as.Date(c("2016/01/01", "2016/01/02")),each=12), 
      Group=rep(x=c("G1","G2"),each=6,times=2), 
      ID=rep(c("G1F1","G1F2","G1F3","G1M4","G1M5","G1M6","G2F1","G2F2","G2F3","G2M4","G2M5","G2M6"),times=2), 
      Gender=rep(c("Female","Male"),each=3,times=4), 
      Weight=c(c(100,100,100,100,120,140),rep(c(100,120,140,100,100,100),times=2),c(100,100,100,100,120,140)), 
      CountComp=c(c(2,2,2,0,0,0),rep(c(0,0,0,2,2,2),times=2),c(2,2,2,0,0,0))) 

ich bin sehr neu für R und dachte, dass dplyr eine Lösung bieten könnte mit group_by und mutate func aber bisher fehlgeschlagen.

Antwort

3

So etwas wie dies funktionieren könnte

df %>% group_by(Date, Group, Gender) %>% 
    mutate(CountComp=sapply(Weight, function(x) sum(abs(x-Weight)<10)-1)) 

Hier haben wir die group_by die Klassen, um Sie für die Zählungen erhalten möchten. Dann verwenden wir mutate, um die neue Spalte zu erhalten. Wir müssen jeden Wert mit jedem anderen Wert in der Gruppe vergleichen. Der einfachste Weg, dies zu tun, war die Verwendung von , um jedes Gewicht nacheinander zu betrachten und es mit den anderen zu vergleichen, um nach Unterschieden zu suchen, die kleiner als 10 sind.

Verwandte Themen