我有一个示例数据框架:
dd <- data.frame(a = factor(c("Hi", "Hi", "Low", "Low"),
levels = c("Low", "Hi"), ordered = T),
b = c(1,2,3,4))
dd
# a b
# 1 Hi 1
# 2 Hi 2
# 3 Low 3
# 4 Low 4
如果列a有"Hi",我想按升序排列b列作为它的值,如果列a有"Low"作为它的价值。我很感激任何帮助!
一种选择是根据'a'的值使用desc
和rev
library(dplyr)
dd %>%
arrange(match(a, c("Hi", "Low")),
case_when(a == "Low" ~ desc(b), TRUE ~ rev(desc(b))))
与产出
a b
1 Hi 1
2 Hi 2
3 Low 4
4 Low 3
或者另一种选择是通过根据'a'中的值更改符号来转换数字列
dd %>%
arrange(match(a, c("Hi", "Low")), b * c(1, -1)[1 + (a == "Low")])
a b
1 Hi 1
2 Hi 2
3 Low 4
4 Low 3
我们可以在ifelse
条件下使用dplyr::arrange
。而不是使用desc
,我们可以使用基础Rrev
函数:
library(dplyr)
dd %>%
arrange(a, ifelse(a == "Hi", b, rev(b))) %>%
arrange(rev(a))
输出:
a b
1 Hi 1
2 Hi 2
3 Low 4
4 Low 3
基数R选项,如果A具有'High'值,则将b
乘以1,否则将order
乘以-1。
with(dd, dd[order(a, b * ifelse(a == 'Hi', 1, -1)), ])
# a b
#4 Low 4
#3 Low 3
#1 Hi 1
#2 Hi 2