如何反转由另一列分组的数据框中一列中值的顺序?
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
给定以下玩具数据框:
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