Данные заказа в определенном порядке в R - PullRequest
0 голосов
/ 30 мая 2018

Допустим, у меня есть следующий data.frame;

NUM   status  name
 1       +       A
 2       +       A
 3       +       B 
 4       -       A
 5       -       A 
 6       +       C 
 7       -       C 
 8       +       A
 9       -       B
 10      -       A 

Как я могу заказать их так:

NUM   status  name
 1       +       A
 4       -       A    
 2       +       A
 5       -       A 
 8       +       A   
 10      -       A 
 3       +       B 
 9       -       B
 6       +       C 
 7       -       C 

Я хочу заказать их сначала по имени.Тогда по статусу.Но мне нужно заказать статус по этой схеме;+, -, +, - Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 30 мая 2018

Вы можете заказать по name, а затем по количеству раз, когда данная пара name, status встречалась.

library(data.table)
setDT(df)

df[order(name, rowid(name, status))]

#     NUM status name
#  1:   1      +    A
#  2:   4      -    A
#  3:   2      +    A
#  4:   5      -    A
#  5:   8      +    A
#  6:  10      -    A
#  7:   3      +    B
#  8:   9      -    B
#  9:   6      +    C
# 10:   7      -    C

Используемые данные:

df <- fread("
NUM   status  name
 1       +       A
 2       +       A
 3       +       B 
 4       -       A
 5       -       A 
 6       +       C 
 7       -       C 
 8       +       A
 9       -       B
 10      -       A 
")
0 голосов
/ 30 мая 2018

Мы можем с помощью row_number с dplyr group_by создать ключ справки для достижения определенного порядка

df %>% 
  group_by(name,status) %>%
  mutate(Helpkey=row_number()) %>%
  arrange(name,Helpkey) %>%
  select(-Helpkey)

# A tibble: 10 x 3
# Groups:   name, status [6]
     NUM status  name
   <int>  <chr> <chr>
 1     1      +     A
 2     4      -     A
 3     2      +     A
 4     5      -     A
 5     8      +     A
 6    10      -     A
 7     3      +     B
 8     9      -     B
 9     6      +     C
10     7      -     C
0 голосов
/ 30 мая 2018

Подход data.table:

library(data.table)

csv <- "
NUM   status  name
 1       +       A
 2       +       A
 3       +       B 
 4       -       A
 5       -       A 
 6       +       C 
 7       -       C 
 8       +       A
 9       -       B
 10      -       A
"

data <- fread(csv)
data[, id := seq_len(.N), by = .(name, status)]
data[order(name, id), .(NUM, status, name)]

    NUM status name
 1:   1      +    A
 2:   4      -    A
 3:   2      +    A
 4:   5      -    A
 5:   8      +    A
 6:  10      -    A
 7:   3      +    B
 8:   9      -    B
 9:   6      +    C
10:   7      -    C
0 голосов
/ 30 мая 2018

Вы можете сделать это в базе R:

df <- df[with(df,order(status,name)),
         ][c(nrow(df)/2,0)+rep(1:(nrow(df)/2),each=2),]
#     NUM status name
# 1    1      +    A
# 4    4      -    A
# 2    2      +    A
# 5    5      -    A
# 8    8      +    A
# 10  10      -    A
# 3    3      +    B
# 9    9      -    B
# 6    6      +    C
# 7    7      -    C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...