在数据框中按组对行进行排序,排序或排序

时间:2019-06-13 07:54:00

标签: 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 = 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中有办法吗?

3 个答案:

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