如何颠倒被另一列分组的数据框中一列的值的顺序?

问题描述 投票:0回答:1

给定以下玩具数据框。

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列组成,其中两列都是升序排列。

所需的结果是相同的数据框,但'B'列的值与'A'列中的值所指定的每个组的值相反。

> 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 
r sorting group-by reverse
1个回答
1
投票

在这种情况下,列'B'是数字,因此使用了 order 函数前面加个减号 df$B 作品

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

更为普遍的使用是与函数 xtfrm 以防'B'列在其他类似情况下不是数字。

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

1
投票

一个简单,整洁的方法。

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

1
投票

你可以试试 ave 如果你是用基数R。

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
© www.soinside.com 2019 - 2024. All rights reserved.