如何在R语言中选择每个组中具有最大值的行?
在 R 编程语言中,要从数据框中选择每组中具有最大值的行,我们可以使用以下讨论的各种方法。
考虑以下在子列中具有多个观察值的数据集。该数据集包含三列,分别为sr_no、sub和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
这里,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))
输出:
正如我们所看到的,这些是每组中具有最大值的选定行。