Порядок, сортировка или ранжирование строк по группам в кадре данных - PullRequest
1 голос
/ 13 июня 2019

У меня есть следующее 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 ]

1 голос
/ 13 июня 2019

Вот один из способов в базе R с использованием split с предположением, что аргумент Times всегда будет 1 или 2, и у вас будет одинаковое количество уникальных Letters для значений 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
1 голос
/ 13 июня 2019

Вот вариант с 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))
1 голос
/ 13 июня 2019

Не уверен, что это соответствует вашей логике, но соответствует ожидаемому результату,

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...