📜  如何在R语言中选择每个组中具有最大值的行?

📅  最后修改于: 2022-05-13 01:55:00.261000             🧑  作者: Mango

如何在R语言中选择每个组中具有最大值的行?

在 R 编程语言中,要从数据框中选择每组中具有最大值的行,我们可以使用以下讨论的各种方法。

考虑以下在子列中具有多个观察值的数据集。该数据集包含三列,分别为sr_no、submarks。

创建数据集:

在这里,我们正在创建用于演示的数据框。

代码块



输出:

roll sub marks
1      1   A     2
2      2   A     3
3      3   B     5
4      4   B     2
5      5   B     5
6      6   C     8
7      7   C    17
8      8   A     3
9      9   C     5
10    10   C     5

这里,roll 和marks 是整数值,sub 是分类值(char),有类别A、B、C。在这个数据集中,A、B、C 代表不同的科目,而marks 是在相应的sub 中获得的分数。

我们可以看到,科目A、B、C在该组中的最大值(分)分别为3、5、17 。我们可以使用以下两种方法选择组中的最大行。

方法1:使用R基础。

步骤 1:将数据集加载到变量(组)中。

R
# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
  
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
group


R
# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# sorting the sub and marks.
sorted_group <- group[order(group$sub, -group$marks),]
  
sorted_group


R
# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# sorting the sub and marks.
sorted_group <- group[order(group$sub, -group$marks),]
  
# removing duplicates from the sorted sub column
ans <- sorted_group[!duplicated(sorted_group$sub),]
  
ans


R
# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# loading library
library("dplyr")


R
# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5,
          8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# loading library
library("dplyr")
  
group %>% group_by(sub) %>% slice(which.max(marks))


输出:

roll sub marks
1      1   A     2
2      2   A     3
3      3   B     5
4      4   B     2
5      5   B     5
6      6   C     8
7      7   C    17
8      8   A     3
9      9   C     5
10    10   C     5

步骤 2:按降序对每组(A、B、C)的标记进行排序。



电阻

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# sorting the sub and marks.
sorted_group <- group[order(group$sub, -group$marks),]
  
sorted_group

输出:

roll sub marks
2      2   A     3
8      8   A     3
1      1   A     2
3      3   B     5
5      5   B     5
4      4   B     2
7      7   C    17
6      6   C     8
9      9   C     5
10    10   C     5

由于我们的现在按升序排列,我们准备选择每个组中具有最大值的行,这里的组是 A、B、C。

第 3 步:从排序的主题列中删除重复的行。

电阻

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# sorting the sub and marks.
sorted_group <- group[order(group$sub, -group$marks),]
  
# removing duplicates from the sorted sub column
ans <- sorted_group[!duplicated(sorted_group$sub),]
  
ans

输出:

这些是每组中具有最大值的选定行。

方法二:使用dplyr包

dplyr 是一个最常用于操作数据框的n R 包。 dplyr为数据操作提供了各种动词(函数),例如过滤、排列、选择、重命名、变异等。



要安装dplyr包,我们必须在 R 控制台中运行以下命令。

install.packages("dplyr")

Step1:加载数据集和库。

电阻

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5, 8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# loading library
library("dplyr")

第 2 步:现在使用group_ by verb (函数) 对数据框sub进行分组,并使用which.max()选择具有最大标记的行。

电阻

# Creating a dataset.
no <- c( 1 : 10)
subject <- c('A', 'A', 'B', 'B', 'B',
             'C', 'C', 'A', 'C', 'C')
mark <- c(2, 3, 5, 2, 5,
          8, 17, 3, 5, 5)
  
group <- data.frame(roll = no, sub = subject, 
                    marks = mark )
  
# loading library
library("dplyr")
  
group %>% group_by(sub) %>% slice(which.max(marks))

输出:

正如我们所看到的,这些是每组中具有最大值的选定行。