2016-07-10 4 views
2

Ich habe einen Datenrahmen Beobachtungen aus der Kontrolle und die Versuchsgruppe mit Replikate für jedes Fach enthält: Hier ist ein Beispiel für meinen Datenrahmen:Wie koppelt man Zeilen in einem Datenrahmen in R mit dplyr?

subject group replicate value 
    A  control  1  10 
    A  control  2  15 
    A  experim  1  40 
    A  experim  2  45 
    B  control  1  5 
    B  experim  1  30 
    C  control  1  50 
    C  experim  1  NA 

Ich mag jede Steuer Beobachtung paaren mit seinem experimentellen entsprechenden eine, um das Verhältnis zwischen den gepaarten Werten zu berechnen. Der gewünschte Ausgang:

subject replicate control experim ratio 
    A   1   10  40  4 
    A   2   15  45  3 
    B   1   5  30  6 
    C   1   50  NA  NA 

Bitte beachten Sie, dass die Anzahl der Wiederholungen für Probanden variieren kann (A hat zwei Replikaten, B nur einen, C hat eine mit einem fehlenden Wert). Idealerweise würde ich dies gern mit dplyr und pipes umgesetzt sehen.

Antwort

3

Wir dcast von data.table verwenden, um ‚breit‘ Format zu konvertieren, dann erstellen Sie die Spalte ‚Verhältnis‘ durch ‚Experim‘ mit ‚Kontrolle‘

library(data.table) 
dcast(setDT(df1), subject+replicate~group, value.var="value")[, 
      ratio:= experim/control][] 
#  subject replicate control experim ratio 
#1:  A   1  10  40  4 
#2:  A   2  15  45  3 
#3:  B   1  5  30  6 
#4:  C   1  50  NA NA 

Oder mit spread von tidyr Dividieren Konvertieren Sie in 'Wide' Format und erstellen Sie dann das 'Ratio' mit mutate.

library(dplyr) 
library(tidyr) 
spread(df1, group, value) %>% 
     mutate(ratio = experim/control) 
# subject replicate control experim ratio 
#1  A   1  10  40  4 
#2  A   2  15  45  3 
#3  B   1  5  30  6 
#4  C   1  50  NA NA 

Oder mit reshape von base R

transform(reshape(df1, idvar = c("subject", "replicate"), 
    timevar="group", direction="wide"), ratio = value.experim/value.control) 
+0

Sie @akrun Danke! Ihre Antwort hat mir die Stärke des Spread-Befehls bewusst gemacht: Er paart die Zeilen automatisch. Dies funktioniert hervorragend für eine einzelne Wertespalte. Ich habe eine ähnliche [Frage aber für mehrere Werte] (http://stackoverflow.com/questions/38297989/how-to-pair-rows-with-multiple-values-in-a-data-frame-using-dplyr- in-r) – Irakli

+0

@Irakli Wenn dies funktioniert, bitte erwägen, die Lösung zu akzeptieren, indem Sie auf das Häkchen neben der Abstimmung klicken – akrun

Verwandte Themen