在 R 中按组选择前 N 个最大值
在本文中,我们将了解如何在 R 语言中按组选择 Top N th最大值。
方法一:使用Reduce方法
数据帧可以通过 order 方法按组按其值的降序排列。然后使用索引方法通过以行索引的形式获取 order 函数的输出来访问相应的数据帧。
Syntax: order(vec, decreasing = TRUE)
Arguments :
- vec – The dataframe column name to arrange in descending order
- decreasing – The flag to set data in descending order
基础 R 中的 Reduce 方法也可用于从数据帧中的每个组中选择前 n 行最高的行。该方法将一个具有两个参数的函数f 以及一个列表或向量 vec 作为输入,该列表或向量 vec 将使用函数f 进行归约。函数f 是 rbind 方法,用于将行绑定在一起以形成数据帧。 R 中的 by() 方法用于将函数应用于数据帧的指定子集。此方法的第一个参数占用数据,第二个参数是应用函数的参数,第三个参数是函数。这里,head 用作使用方法调用的第三个参数指定的函数。它用于从数据框中指定 n 行组。
Syntax: by(df, df$col-name, FUN)
Arguments :
- df – The dataframe to apply the functions on
- FUN – The function to be applied
组合函数应用可概括如下:
Reduce(rbind,by())
代码:
R
# creating dataframe
data_frame <- data.frame(col1 = rep(letters[1:4], each = 5),
col2 = 1:20,
col3 = 20:39)
print("Original DataFrame")
print(data_frame)
# sorting the data by the column
# required in descending order
data_sorted <- data_frame[order(data_frame$col2,
decreasing = TRUE), ]
# select top 3 values from each group
data_mod <- Reduce(rbind,
by(data_sorted,
data_sorted["col1"],
head,
n = 3))
print ("Modified DataFrame")
print (data_mod)
R
library("dplyr")
# creating dataframe
data_frame <- data.frame(col1 = rep(letters[1:4], each = 5),
col2 = 1:20,
col3 = 20:39)
print("Original DataFrame")
print(data_frame)
# sorting the data by the column
# required in descending order
data_mod<- data_frame %>%
arrange(desc(col2)) %>%
group_by(col1) %>%
slice(1:3)
print("Modified DataFrame")
print(data_mod)
R
library("data.table")
# creating dataframe
data_frame <- data.frame(col1 = rep(letters[1:4], each = 5),
col2 = 1:20,
col3 = 20:39)
print("Original DataFrame")
print(data_frame)
# sorting the data in descending order
# Top N highest values by group
data_mod <- data_frame[order(data_frame$col2, decreasing = TRUE), ]
# organising the data by group
data_mod <- data.table(data_mod, key = "col1")
# getting top2 values
data_mod <- data_mod[ , head(.SD, 2), by = col1]
# printing modified dataframe
print("Modified DataFrame")
print(data_mod)
输出:
方法二:使用 dplyr 包
R 中的 dplyr 包用于在 R 中执行突变和数据操作。它对于处理数据框和数据表特别有用。可以使用以下命令将包下载并安装到工作目录中:
install.packages(“dplyr”)
此包中提供了一系列方法,用于从数据框中的每个组中选择前 n 行。最初,调用arrange()方法以升序或降序排列数据帧的数据。使用 desc() 方法调用降序。在此方法中指定为参数的列名用于排列数据。
arrange(desc(col-name))
接下来是 group_by 方法的应用,该方法将用于对数据进行分组的列名集作为参数。它可以由一个或多个列组成。
group_by(col-name1, col-name2..)
然后 slice() 方法用于从数据帧中检索前 n 行。
slice(1:n)
输出以 tibble 的形式返回,其中包含有关返回的行的完整信息。不保留原始数据框的行号。
代码:
R
library("dplyr")
# creating dataframe
data_frame <- data.frame(col1 = rep(letters[1:4], each = 5),
col2 = 1:20,
col3 = 20:39)
print("Original DataFrame")
print(data_frame)
# sorting the data by the column
# required in descending order
data_mod<- data_frame %>%
arrange(desc(col2)) %>%
group_by(col1) %>%
slice(1:3)
print("Modified DataFrame")
print(data_mod)
输出:
方法3:使用data.table包
R 中的 data.table 方法用于以组织良好的方式执行数据存储和操作。可以使用以下命令将包下载并安装到工作目录中:
install.packages(data.table)
数据表可以通过 order 方法按组按其值的降序重新排序。然后使用索引方法通过以行索引的形式获取 order 函数的输出来访问相应的数据帧。
Syntax: order(vec, decreasing = TRUE)
Arguments :
Vec – The dataframe column name to arrange in descending order
Decreasing – The flag to set data in descending order
然后可以使用 data.table() 方法以及要在 setKey() 方法中使用的列名将数据框转换为数据表。 key 属性包含在 data.table 中对数据进行分组的列名。
data.table(df, key = )
现在,head 和 .SD 属性可用于访问每个拍摄组的前 n 行。 by 参数包含分组列。 head 方法将 .SD 和整数值 n 作为参数。
df[ , head(.SD, 3), by =]
代码:
R
library("data.table")
# creating dataframe
data_frame <- data.frame(col1 = rep(letters[1:4], each = 5),
col2 = 1:20,
col3 = 20:39)
print("Original DataFrame")
print(data_frame)
# sorting the data in descending order
# Top N highest values by group
data_mod <- data_frame[order(data_frame$col2, decreasing = TRUE), ]
# organising the data by group
data_mod <- data.table(data_mod, key = "col1")
# getting top2 values
data_mod <- data_mod[ , head(.SD, 2), by = col1]
# printing modified dataframe
print("Modified DataFrame")
print(data_mod)
输出: