给定以下玩具数据框。
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
在这种情况下,列'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))]
一个简单,整洁的方法。
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
你可以试试 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