2016-05-22 6 views
1

I für jede Person eine Längs Datensatz mit wiederholten Beobachtungen haben:für jede Kombination von Reihen mit benutzerdefinierten Funktion zusammenzufassen

df <- data.frame(person= c(rep(1,5), rep(2,10)), 
         x= c(0,rnorm(14)), 
         y= c(0,rnorm(14))) 

Ich habe eine benutzerdefinierte Funktion, die zwei x und y Werte als Eingabe und berechnet einen Wert , wie folgt aus:

myfunc <- function(x1, y1, x2, y2) 
    return(x1+y1+x2+y2) 

ich möchte nun den Maximalwert (oder eine andere Statistik) aller Zeilenkombinationen eine Person hat zu finden.

Stellen Sie sich vor x und y sind geographische Standorte, die diese Person besuchte, myfunc berechnet den Abstand zwischen zwei x/y-Koordinaten. Ich möchte die maximale Entfernung zwischen diesen Punkten finden.

Wie Sie sehen können, können meine Daten Nullen haben, wo ich die Werte x und y nicht kenne, diese Zeilen sollten übersprungen werden.

Dies sollte in einer Zusammenfassung sein, weil meine realen Daten viel mehr Variablen hat und ich fasse für diese auch zusammen.

So sollte der erste Teil sein:

result <- df %>% group_by(person) %>% 
        summarise(maxd = #maximum distance, 
           mind = #minimum distance, 
           ......) 

Mein erster Gedanke wäre dies mit expand.grid irgendwie zu tun, alle möglichen Zeilenkombinationen zu erhalten:

row.combis <- expand.grid(i=1:6, j=1:6) # all row combinations 
row.combis <- row.combis[row.combis$j < row.combis$i, ] # skip duplicates 

und dann Schleife myfunc über die row.combis irgendwie.

Aber es muss einen klügeren Weg geben.

Antwort

2

Nehmen wir an, wenn Sie die normale kartesische Entfernung berechnen möchten, können Sie dist() Funktion verwenden. Hier ist ein data.table Weg, um die Zusammenfassung zu erhalten:

library(data.table) 
setDT(df)[, .(maxd = max(dist(data.table(x, y))), 
       mind = min(dist(data.table(x, y)))), .(person)] 

    person  maxd  mind 
1:  1 3.264005 0.4734630 
2:  2 2.514413 0.4359193 

Eine entsprechende dplyr Methode wie:

df %>% group_by(person) %>% summarise(maxd = max(dist(data.frame(x, y))), 
             mind = min(dist(data.frame(x, y)))) 
Source: local data table [2 x 3] 

    person  maxd  mind 
    (dbl) (dbl)  (dbl) 
1  1 3.264005 0.4734630 
2  2 2.514413 0.4359193 
+0

danke, ich wusste nicht über die integrierte dist-Funktion. Genau das möchte ich, aber wie werden die Nullen hier gehandhabt? – spore234

+0

Wenn Sie sich auf die erste Zeile Ihres Datenrahmens beziehen, wo sowohl 'x' als auch 'y' Nullen sind, ist es nur ein normaler Punkt und wird genauso behandelt wie andere Punkte in der 'dist() 'Funktion. – Psidom

+0

ok, aber die Nullen sind nur Platzhalter und bedeuten im Grunde genommen "NA". Ich will nicht falsche Max- und Min-Abstände basierend auf ihnen bekommen – spore234

0

Was ist mit der Zuordnung der fehlenden Werte zu 'NA' anstelle von '0'. Dies würde Ihnen die Möglichkeit, einfache Tests wie ausführen:

is.na(test_row[i]) 

oder sein Kompliment

is.finite(test_row[i]) 

Auch dies gibt Ihnen den Umgang mit diesen on the fly in Ihrem summarize() -Aufruf zugreifen. Die meisten Funktionen wie mean(), max() usw. verwenden ein optionales Argument 'na.rm = logisch'. Die Defaults sind fast immer FALSE, aber das Umschalten auf "TRUE" kann besonders für numerische Berechnungen sehr nützlich sein.

+0

ja, Umkodierung die Nullen NA ist möglich, aber ich weiß nicht genau eine Antwort sehen in Ihr Beitrag – spore234

Verwandte Themen