Как упорядочить / отсортировать по уникальным последовательностям? - PullRequest
1 голос
/ 03 октября 2019

A) Вот мой фрейм данных , упорядоченный по пластинам:

df <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
plate phase  score
A      1      1
A      1      1
A      1      1

A      2      1
A      2      1
A      2      1

A      3      2
A      3      2
A      3      2

B      1      1
B      1      1
B      1      2

B      2      1
B      2      1
B      2      3")

B) Цель: я хочу упорядочить сначала по обеим пластинам и , а затем Фаза, но последовательно (см. ниже, как строки расположены в алфавитном порядке по пластинам, но последовательно по фазе

   plate phase score
   <chr> <int> <int>
 1 A         1     1
 2 A         2     1
 3 A         3     2
 4 A         1     1
 5 A         2     1
 6 A         3     2
 7 A         1     1
 8 A         2     1
 9 A         3     2
10 B         1     1
11 B         2     1
12 B         1     1
13 B         2     1
14 B         1     2
15 B         2     3

Ответы [ 2 ]

2 голосов
/ 03 октября 2019
df[with(df, order(plate, ave(phase, phase, FUN = seq_along), phase)),]
#>    plate phase score
#> 1      A     1     1
#> 4      A     2     1
#> 7      A     3     2
#> 2      A     1     1
#> 5      A     2     1
#> 8      A     3     2
#> 3      A     1     1
#> 6      A     2     1
#> 9      A     3     2
#> 10     B     1     1
#> 13     B     2     1
#> 11     B     1     1
#> 14     B     2     1
#> 12     B     1     2
#> 15     B     2     3
2 голосов
/ 03 октября 2019

Один из вариантов - создать переменную последовательности, сгруппированную по «plate», «phase» и arrange на ней вместе с «plate» и «score»

library(dplyr)
df %>%
   group_by(plate, phase) %>%
   mutate(rn = row_number()) %>%
   ungroup %>%
   arrange(plate, rn, score) %>% 
   select(-rn)
# A tibble: 15 x 3
#   plate phase score
#   <chr> <int> <int>
# 1 A         1     1
# 2 A         2     1
# 3 A         3     2
# 4 A         1     1
# 5 A         2     1
# 6 A         3     2
# 7 A         1     1
# 8 A         2     1
# 9 A         3     2
#10 B         1     1
#11 B         2     1
#12 B         1     1
#13 B         2     1
#14 B         1     2
#15 B         2     3

Или с использованием data.table

library(data.table)
setDT(df)[order(plate, rowid(phase), score)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...