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