📜  在 R 中按组选择前 N 个最大值

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

在 R 中按组选择前 N 个最大值

在本文中,我们将了解如何在 R 语言中按组选择 Top N th最大值。

方法一:使用Reduce方法

数据帧可以通过 order 方法按组按其值的降序排列。然后使用索引方法通过以行索引的形式获取 order 函数的输出来访问相应的数据帧。

基础 R 中的 Reduce 方法也可用于从数据帧中的每个组中选择前 n 行最高的行。该方法将一个具有两个参数的函数f 以及一个列表或向量 vec 作为输入,该列表或向量 vec 将使用函数f 进行归约。函数f 是 rbind 方法,用于将行绑定在一起以形成数据帧。 R 中的 by() 方法用于将函数应用于数据帧的指定子集。此方法的第一个参数占用数据,第二个参数是应用函数的参数,第三个参数是函数。这里,head 用作使用方法调用的第三个参数指定的函数。它用于从数据框中指定 n 行组。

组合函数应用可概括如下:

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 函数的输出来访问相应的数据帧。

然后可以使用 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)

输出: