R 如何按降序对数据帧进行排序

R 如何按降序对数据帧进行排序,r,sorting,R,Sorting,我有一个数据。framev1,v2,y 现在我想让它按y排序如下: y: 1 2 3 4 1 2 3 4 v1: 1 8 1 6 5 6 1 8 v2: 2 9 4 2 6 8 5 3 我试过: sorted <- df[,,sort(df$y)] 但这是行不通的。。请帮助您可以尝试tidyverse解决方案 library(tidyverse) data.frame(y, v1, v2) %>% group_by(y) %>% mutate(n=1:n(

我有一个数据。framev1,v2,y

现在我想让它按y排序如下:

y: 1 2 3 4 1 2 3 4

v1: 1 8 1 6 5 6 1 8

v2: 2 9 4 2 6 8 5 3
我试过:

sorted <- df[,,sort(df$y)] 

但这是行不通的。。请帮助

您可以尝试tidyverse解决方案

library(tidyverse)
data.frame(y, v1, v2) %>% 
  group_by(y) %>% 
  mutate(n=1:n()) %>% 
  arrange(n, y) %>% 
  select(-n) %>% 
  ungroup()
# A tibble: 8 x 3
      y    v1    v2
  <dbl> <dbl> <dbl>
1     1     1     2
2     2     8     9
3     3     1     4
4     4     6     2
5     1     5     6
6     2     6     8
7     3     1     5
8     4     8     3
数据:


其思想是沿y添加索引,然后按索引和y排列

你可以试试tidyverse解决方案

library(tidyverse)
data.frame(y, v1, v2) %>% 
  group_by(y) %>% 
  mutate(n=1:n()) %>% 
  arrange(n, y) %>% 
  select(-n) %>% 
  ungroup()
# A tibble: 8 x 3
      y    v1    v2
  <dbl> <dbl> <dbl>
1     1     1     2
2     2     8     9
3     3     1     4
4     4     6     2
5     1     5     6
6     2     6     8
7     3     1     5
8     4     8     3
数据:

其思想是沿y添加索引,然后按索引和y排列

我们可以使用基于R的ave,按“y”组创建一个序列,并对其进行排序

数据 我们可以使用基于R的ave创建一个序列,按“y”组排序

数据
您还可以执行两次交替子集,并将它们结合在一起:

rbind(df[c(TRUE,FALSE),], df[c(FALSE,TRUE),])
结果是:

  v1 v2 y
1  1  2 1
3  8  9 2
5  1  4 3
7  6  2 4
2  5  6 1
4  6  8 2
6  1  5 3
8  8  3 4

您还可以执行两次交替子集,并将它们结合在一起:

rbind(df[c(TRUE,FALSE),], df[c(FALSE,TRUE),])
结果是:

  v1 v2 y
1  1  2 1
3  8  9 2
5  1  4 3
7  6  2 4
2  5  6 1
4  6  8 2
6  1  5 3
8  8  3 4
您可以使用矩阵对行的索引进行重新排序:

df <- data.frame(v1 = c(1, 5, 8, 6, 1, 1, 6, 8), 
                 v2 = c(2, 6, 9, 8, 4, 5, 2, 3), 
                 y = c(1, 1, 2, 2, 3, 3, 4, 4))
df[c(matrix(1:nrow(df), ncol=2, byrow=TRUE)),]
#   v1 v2 y
# 1  1  2 1
# 3  8  9 2
# 5  1  4 3
# 7  6  2 4
# 2  5  6 1
# 4  6  8 2
# 6  1  5 3
# 8  8  3 4
该解决方案使用了矩阵元素在R中存储的顺序,就像在FORTRAN中一样,第一维的索引首先运行。在FORTRAN中,对于二维数组(即矩阵),第一个维度的值数使用端点前导维度。它是行数。

您可以使用矩阵对行的索引进行重新排序:

df <- data.frame(v1 = c(1, 5, 8, 6, 1, 1, 6, 8), 
                 v2 = c(2, 6, 9, 8, 4, 5, 2, 3), 
                 y = c(1, 1, 2, 2, 3, 3, 4, 4))
df[c(matrix(1:nrow(df), ncol=2, byrow=TRUE)),]
#   v1 v2 y
# 1  1  2 1
# 3  8  9 2
# 5  1  4 3
# 7  6  2 4
# 2  5  6 1
# 4  6  8 2
# 6  1  5 3
# 8  8  3 4

该解决方案使用了矩阵元素在R中存储的顺序,就像在FORTRAN中一样,第一维的索引首先运行。在FORTRAN语言中,对于二维数组(即矩阵),第一个维度的值数使用端点前导维度。它是行数。

您也可以使用mutaten=row\u numbery您也可以使用mutaten=row_number@Renu否,这将复制原始数据帧-不是所需的输出。@Renu否,这将再现原始数据帧,而不是期望的输出。