r - 如何按 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
. 这种方法有效,但在有很多不同条件时非常乏味。似乎应该有一种更简单的方法来做到这一点,但我一直找不到。非常感激任何的帮助。谢谢!
解决方案
也许这个?
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
推荐阅读
- java - 唤醒锁只工作一次
- oracle - 将旧数据从EBS数据库表迁移到另一个数据库的方法有哪些12c
- r - For-loop 不会循环遍历列表的长度
- python-3.x - 为什么standardscaler和normalizer需要不同的数据输入?
- c# - 仅当 blob 存在时才获取 Azure blob 元数据
- javascript - 显示未评估键的 JSON POST 请求对象
- php - 在执行第一行之前,php 是否有任何方面可能导致页面加载失败?
- python - 我如何知道调用 create_all() 时 SQLAlchemy 是否必须创建表?
- java - 如果目标级别为 8,我可以使用 module-info.java 吗?
- three.js - 如何在 Three.js 中使用 Texture.clone?