2017-01-25 4 views
0

Dies ist eine ähnliche Frage wie reordering groups with dataframe, unterscheidet sich jedoch darin, dass es mehr als zwei Variablen gibt. Beispieldaten:R: Mehrere Variablengruppen neu anordnen

raw <- "Date   Response  ZNumber  Latency ZPV 
     2016-05-04 1   1   445.562 59.666 
     2016-05-04 2   1   433.890 97.285 
     2016-05-04 3   1   372.073 53.994 
     2016-05-04 4   1   282.337 89.686 
     2016-05-04 4   2   333.186 57.471 
     2016-05-04 5   1   320.500 71.968 
     2016-05-04 5   2   280.818 49.187 
     2016-07-14 1   1   411.849 65.539 
     2016-07-14 2   1   346.814 50.626" 
data <- read.table(text=raw, header = TRUE) 

Person 'Date-Antwort-ZNumber' und 'Latency-ZPV' ist immer richtig verbunden. Die ZNumber-Reihenfolge pro Datumsantwort sollte in aufsteigender Reihenfolge der Latenz definiert werden.

Das Problem in meinen Daten ist, dass manchmal, wenn eine Datum-Antwort mehr als eine ZNumber, die Latenz um manchmal nicht die ZNumber um beispielsweise überein Datum = 2016-05-04, Antwort = 4 hat aufsteigende Reihenfolge sowohl in ZNumber als auch in Latency, während Date = 2016-05-04, Response = 5 die ZNumber ist aufsteigend, während Latency absteigend ist.

Ich kann die richtigen Split-Apply-Combine-Operationen nicht finden.


Ausgabe

Was würde ich gerne ausgeführt ist sowohl ZNumber und Latency aufzusteigen zusammen in einer ‚Datum-Antwort‘ Gruppe z.B. Date = 2016.05.04, Response = 5

"Date   Response  ZNumber  Latency ZPV 
2016-05-04 1   1   445.562 59.666 
2016-05-04 2   1   433.890 97.285 
2016-05-04 3   1   372.073 53.994 
2016-05-04 4   1   282.337 89.686 
2016-05-04 4   2   333.186 57.471 
2016-05-04 5   1   280.818 49.187 
2016-05-04 5   2   320.500 71.968 
2016-07-14 1   1   411.849 65.539 
2016-07-14 2   1   346.814 50.626" 

dplyr

Zahlreiche Versuche zu lösen, wie unten, haben nicht funktioniert ...

library(dplyr) 

data <- data %>% 
group_by(Date, Response) %>% 
arrange(Latency, ZNumber) %>% 
arrange(Date, Response) 

oder, wie in der oben verlinkten Frage vorgeschlagen ...

data <- data %>% 
arrange(df, group, desc(value)) 

mit den verschiedenen 'mutierenden Joins' ohne Erfolg. z.B.

data <- data %>% 
    group_by(Date,Response) %>% 
    select(Latency) %>% 
    arrange(Latency) %>% 
    arrange(Response) %>% 
    full_join(data,by=c("Date","Response")) 

hat jetzt jedoch zwei Latenzspalten.


sessionInfo() 
R version 3.3.2 (2016-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 
other attached packages: 
[1] dplyr_0.5.0 
loaded via a namespace (and not attached): 
[1] lazyeval_0.2.0 magrittr_1.5 R6_2.2.0  assertthat_0.1 DBI_0.5-1  
[6] tools_3.3.2 tibble_1.2  Rcpp_0.12.8 
+0

Das sind nur die Daten. Reihenfolge manipuliert keine Datenpunkte. Für * Response * # 5 wird * ZNumber * immer aufsteigen und * Latency * absteigen. Sortieren Sie den einen und den anderen Zähler. Glaub mir nicht? Versuchen Sie, die gewünschte Ausgabe anzuzeigen, damit wir sehen können, ob Sie nach Datenzellenänderungen fragen. – Parfait

+0

Hoppla, ja - bearbeitet mit Ausgabe gewünscht. Auch geklärte Operationen versucht. –

Antwort

0

Ich habe Lösung mit data.table, die schön und einfach mit minimalem Scripting arbeitet

raw <- "Date   Response  ZNumber  Latency ZPV 
     2016-05-04 1   1   445.562 59.666 
2016-05-04 2   1   433.890 97.285 
2016-05-04 3   1   372.073 53.994 
2016-05-04 4   1   282.337 89.686 
2016-05-04 4   2   333.186 57.471 
2016-05-04 5   1   320.500 71.968 
2016-05-04 5   2   280.818 49.187 
2016-07-14 1   1   411.849 65.539 
2016-07-14 2   1   346.814 50.626" 
data <- read.table(text=raw, header = TRUE) 
library(data.table) 
data <- data.table(data) 
data <- data[order(as.numeric(Latency))] 
data[,new_ZNumber:=1:length(Latency),by=.(Date,Response)] 
data <- data[order(Date,as.numeric(Response),as.numeric(Latency))] 
data 

Ausgang:

  Date Response ZNumber Latency ZPV new_ZNumber 
1: 2016-05-04  1  1 445.562 59.666   1 
2: 2016-05-04  2  1 433.890 97.285   1 
3: 2016-05-04  3  1 372.073 53.994   1 
4: 2016-05-04  4  1 282.337 89.686   1 
5: 2016-05-04  4  2 333.186 57.471   2 
6: 2016-05-04  5  2 280.818 49.187   1 
7: 2016-05-04  5  1 320.500 71.968   2 
8: 2016-07-14  1  1 411.849 65.539   1 
9: 2016-07-14  2  1 346.814 50.626   1 

nicht sicher, warum ddply nicht tut, was Sie wollen aber lass es mich wissen, wenn du das vorhast.

BEARBEITEN: Hinzugefügt umgebaut ZNumber genannt new_ZNumber pro OP Anfrage.

+0

OP fragt: * so dass sowohl ZNumber als auch Latency zusammen mit einer 'Date-Response'-Gruppe * aufsteigend sind. Für Antwort # 5 in Ihrer Lösung wird * ZNumber * abstammen. OP erzwingt Daten in einer Reihenfolge, die nicht für alle Datensätze möglich ist. – Parfait

+0

Ja, ich habe deinen Kommentar zur OP-Frage gesehen, du hast absolut recht. Aber es gibt auch nichts, was getan werden kann, aus den Gründen, die Sie angegeben haben – JustGettinStarted

+0

Wie von @Parfait, in Antwort Gruppe # 5 sowohl Latency als auch ZNumber sind nicht aufsteigend ... –