Как я могу отсортировать фрейм данных по нескольким столбцам в R? - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь отсортировать разные подмножества строк в кадре данных по разным столбцам, в зависимости от значения в другом столбце. Так, например, все строки с данным значением в столбце D должны быть отсортированы по столбцу B, тогда как все строки с другим значением в столбце D должны быть отсортированы по столбцу C. Вот пример фрейма данных:

colA <- sample(LETTERS, 6)
colB <- sample(c(1:100), 6)
colC <- sample(c(101:200), 6)
condition <- rep(c("good", "bad"), each = 1, times = 3)
df <- data.frame(colA, colB, colC, condition)

>df
  colA colB colC condition
1    F   44  187      good
2    C   32  179       bad
3    A   93  191      good
4    U   66  146       bad
5    Q   72  156      good
6    O   92  124       bad

Я хотел бы отсортировать этот фрейм данных по colB, если условие «плохое», и по col C, если условие «хорошее», что приводит к

> df_sorted
  colA colB colC condition
1    C   32  179       bad
2    U   66  146       bad
3    O   92  124       bad
4    Q   72  156      good
5    F   44  187      good
6    A   93  191      good

До сих пор я создавал отдельные фреймы данных для каждого условия, сортируя их по отдельности, а затем возвращая их вместе с rbind. Этот подход работает, но довольно утомительно, когда есть много разных условий. Кажется, должен быть более простой способ сделать это, но я не смог найти его. Любая помощь будет наиболее ценной. Спасибо!

1 Ответ

1 голос
/ 15 апреля 2020

Возможно это?

set.seed(42)
colA <- sample(LETTERS, 6)
colB <- sample(c(1:100), 6)
colC <- sample(c(101:200), 6)
condition <- rep(c("good", "bad"), each = 1, times = 3)
df <- data.frame(colA, colB, colC, condition)
df
#   colA colB colC condition
# 1    X   74  194      good
# 2    Z   14  126       bad
# 3    G   65  146      good
# 4    T   69  192       bad
# 5    O   44  200      good
# 6    K   97  112       bad

df[with(df, order(condition, ifelse(condition == "bad", colB, colC))),]
#   colA colB colC condition
# 2    Z   14  126       bad
# 4    T   69  192       bad
# 6    K   97  112       bad
# 3    G   65  146      good
# 1    X   74  194      good
# 5    O   44  200      good
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...