R 在数据帧中按组对行进行排序、排序或排序

R 在数据帧中按组对行进行排序、排序或排序,r,dataframe,rows,R,Dataframe,Rows,我有以下df > df A 1 B 2 B 2 C 1 D 2 D 2 E 1 F 2 F 2 df=data.frame(字母=Letters[1:6],Times=rep(c(1,2)),stringsAsFactors=FALSE) df=df[rep(seq_len(nrow(df)),df$次] 但是我想对我的行重新排序,如下所示: > df B 2 B 2 A 1 D 2 D 2 C 1 F 2 F

我有以下
df

> df

A   1
B   2
B   2
C   1
D   2
D   2
E   1
F   2
F   2
df=data.frame(字母=Letters[1:6],Times=rep(c(1,2)),stringsAsFactors=FALSE)
df=df[rep(seq_len(nrow(df)),df$次]

但是我想对我的行重新排序,如下所示:

> df

B   2
B   2
A   1
D   2
D   2
C   1
F   2
F   2
E   1
我找到了类似但又不同的问题的答案。不过,似乎没有一个能解决我的问题


BaseR
中是否有这样做的方法?

不确定这是否符合您的逻辑,但它确实与预期输出一致

library(dplyr)

df %>% 
 arrange(desc(Letters)) %>% 
 arrange(desc(cumsum(c(0, diff(Times) == 1))))

#  Letters Times
#1       B     2
#2       B     2
#3       A     1
#4       D     2
#5       D     2
#6       C     1
#7       F     2
#8       F     2
#9       E     1

这里有一种方法是在base R中使用
split
并假设
Times
参数始终为1或2,并且1和2个值的唯一
字母数都相同

lst <- split(seq_len(nrow(df)), df$Letters)
df[unlist(c(rbind(lst[lengths(lst) == 2], lst[lengths(lst) == 1]))), ]

#  Letters Times
#2       B     2
#3       B     2
#1       A     1
#5       D     2
#6       D     2
#4       C     1
#8       F     2
#9       F     2
#7       E     1

lst这里有一个带有
base R的选项

lvls <- c(do.call(rbind, with(unique(df), split(Letters, 
    factor(Times, levels = sort(unique(Times), decreasing = TRUE))))))
df[order(factor(df$Letters, levels = lvls)),]
#   Letters Times
#2       B     2
#3       B     2
#1       A     1
#5       D     2
#6       D     2
#4       C     1
#8       F     2
#9       F     2
#7       E     1

lvls我想使其适应更大的
df
,其中编号为
1
字母为税,编号为
2的
字母为无税总价。这就是为什么,例如,
B
D
F
会重复两次。如果您想手动确定序列,最简单的方法是将列转换为因子,将序列输入到
levels
参数,然后使用您喜欢的方法对其排序。效果非常好!谢谢如果有重复的
字母
,而不仅仅是
唯一的
,该怎么办?@Cahidora你能用一个例子更新帖子(或作为一个新问题发布)
df <- structure(list(Letters = c("A", "B", "B", "C", "D", "D", "E", 
"F", "F"), Times = c(1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L)),
  class = "data.frame", row.names = c(NA, 
-9L))