2017-01-25 1 views
0

Это аналогичный вопрос reordering groups with dataframe, однако отличается тем, что существует более двух переменных. Пример данные:R: Изменить порядок переменных групп

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) 

Индивидуальные 'Дата-ответ-ZNumber' и 'Задержка-ZPV' всегда правильно связан. Порядок ZNumber на дату-ответ должен определяться по возрастанию латентности.

Проблема в моих данных заключается в том, что иногда, когда дата-ответ имеет более одного ZNumber, порядок задержки иногда не соответствует порядку ZNumber, например. Date = 2016-05-04, Response = 4 имеет восходящий порядок как в ZNumber, так и в Latency, тогда как Date = 2016-05-04, Response = 5 ZNumber восходит, когда Latency спускается.

Я не могу найти правильные операции split-apply-comb.


Выход

Что я хотел бы выполняться одновременно ZNumber и Latency подняться вместе в группе 'Date-Response', например, Date = 2016-05-04, ответ = 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

Многочисленные попытки решить, например, как показано ниже, не работал ...

library(dplyr) 

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

или, как предложено в вышеупомянутом связанном вопросе ...

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

с различными «мутировавшими объединениями» без успеха. например

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

однако теперь есть две колонки латентности.


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

Вот только данные. Заказ не обрабатывает точки данных. Для * Response * # 5, * ZNumber * всегда будет подниматься и * Latency * спускается. Сортируйте один и другие счетчики. Не верьте мне? Попробуйте показать желаемый результат, чтобы мы могли видеть, запрашиваете ли вы изменения ячейки данных. – Parfait

+0

Упс, да - отредактирован с желаемым выходом. Произошли также проясненные операции. –

ответ

0

У меня есть решение с data.table, который работает хорошо и легко с минимальным скриптингом

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 

Выход:

  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 

Не уверен, почему ddply не делать то, что вы хотите но дайте мне знать, если это то, что вы имели в виду.

EDIT: Добавлен перестроенный ZNumber по имени new_ZNumber по запросу ОП.

+0

ОП задает: * так, что оба ZNumber и Latency возрастают вместе с группой «Дата-Ответ» *. Для ответа №5 в вашем решении, * ZNumber * спускается. OP заставляет данные в порядке, который невозможен для всех записей. – Parfait

+0

Да, я видел ваш комментарий к вопросу OPs, вы абсолютно правы. Но также нет ничего, что можно было бы сделать по причинам, которые вы указали. – JustGettinStarted

+0

Как указано в @Parfait, в группе Response # 5 как Latency, так и ZNumber не возрастают ... –