首页 > 解决方案 > 如何按 R 中的多列有条件地对数据框进行排序?

问题描述

我正在尝试按不同列对数据框中的不同行子集进行排序,具体取决于另一列中的值。因此,例如,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 排序这个数据帧,如果条件“好”,我想按 colC 排序,导致

> 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. 这种方法有效,但在有很多不同条件时非常乏味。似乎应该有一种更简单的方法来做到这一点,但我一直找不到。非常感激任何的帮助。谢谢!

标签: rdataframesorting

解决方案


也许这个?

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

推荐阅读