按R中的特定顺序排序数据

按R中的特定顺序排序数据,r,sorting,R,Sorting,假设我有下面的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 st

假设我有下面的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 
我想先点名订购。然后是身份。但是我需要在这个模式中排序状态;+,-,+-
提前感谢。

您可以在base 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

df我们可以使用
row\u number
dplyr
group\u 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
df%>%
分组人(姓名、状态)%>%
变异(Helpkey=row_number())%>%
排列(名称,帮助键)%>%
选择(-Helpkey)
#一个tibble:10x3
#组:名称、状态[6]
NUM状态名
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

数据表
方法:

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
库(data.table)

csv您可以按
名称
排序,然后按给定的
名称、状态
对出现的次数排序

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 
")
df