我有以下df
> df
A 1
B 2
B 2
C 1
D 2
D 2
E 1
F 2
F 2
df = data.frame(Letters = LETTERS[1:6], Times = rep(c(1,2)), stringsAsFactors = FALSE)
df = df[rep(seq_len(nrow(df)), df$Times),]
但是我想reorder
/ sort
/ rank
(不确定要使用什么)我的行,如下所示:
> df
B 2
B 2
A 1
D 2
D 2
C 1
F 2
F 2
E 1
我在SO上找到了类似但不同的问题的答案。尽管如此,他们似乎都没有解决我的问题。
在BaseR
中有办法吗?
答案 0 :(得分:1)
不确定这是否符合您的逻辑,但是否与预期输出一致
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
答案 1 :(得分:1)
这是在split
参数始终为1或2的情况下使用Times
的基数R的一种方法,并且对于1和2您将拥有相同数量的唯一Letters
值。
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
答案 2 :(得分:1)
这里是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
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))