如何反转由另一列分组的数据框中一列中值的顺序?

How to reverse the order of values in one column in a dataframe grouped by another column?

给定以下玩具数据框:

df <- data.frame(A = c("A", "A", "A", "B", "B", "C", "C", "C", "C", "C"),
                 B = c(1, 2, 3, 1, 2, 1, 2, 3, 4, 5))

此数据框包含 2 列,其中两列均按升序排序。

所需的结果是相同的数据框,但对于由第 'A' 列中的值指定的每个组,第 'B' 列的值是相反的:

> df
   A B
1  A 3
2  A 2
3  A 1
4  B 2
5  B 1
6  C 5
7  C 4
8  C 3
9  C 2
10 C 1 

在这种情况下,列 'B' 是数字,因此在 df$B 前面使用带有减号的 order 函数有效

df$B <- df$B[order(df$A, -df$B)]

如果在其他类似情况下第 'B' 列不是数字,则函数 xtfrm 更通用:

df$B <- df$B[order(df$A, -xtfrm(df$B))]

一个简单、整洁的方法:

df %>% arrange(A, desc(B))

输出为

   A B
1  A 3
2  A 2
3  A 1
4  B 2
5  B 1
6  C 5
7  C 4
8  C 3
9  C 2
10 C 1

如果你使用的是 base R:

,你可以尝试 ave
df <- within(df,B <- ave(B,A,FUN = function(x) sort(x,decreasing = TRUE)))

这给出了

> df
   A B
1  A 3
2  A 2
3  A 1
4  B 2
5  B 1
6  C 5
7  C 4
8  C 3
9  C 2
10 C 1