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
这里,卷子和分数是整数值,子是分类值(char),有A、B、C三个类别。
我们可以看到 科目 A、B、C的最大值(分数)分别为 3 、 5、17 。我们可以用以下两种方法选择组中的最大行。
方法1:使用R基础。
第1步: 将数据集加载到一个变量(组)。
# 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
输出
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(groupsub, -groupmarks),]
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(groupsub, -groupmarks),]
# removing duplicates from the sorted sub column
ans <- sorted_group[!duplicated(sorted_group$sub),]
ans
输出
这些是在每组中选择的具有最大数值的行。
方法2:使用dplyr包
dplyr 是一个最常用 于 处理数据框架的R包。 dplyr 为数据处理提供了各种动词(函数),如过滤、排列、选择、重命名、突变等。
为了安装 dplyr 包,我们必须在R控制台运行以下命令。
install.packages("dplyr")
第1步: 加载数据集和库。
# 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 动词(函数)对数据 框子 进行分组,并使用 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))
输出
我们可以看到,这些是在每组中具有最大价值的选定行。