R语言 按组选择前N个最高值
在这篇文章中,我们将看到如何在R语言中按组选择前N个 最高值。
方法1:使用降序法
可以通过order方法将数据帧按组的数值降序排列。然后使用索引方法访问相应的数据框架,以行索引的形式获取order函数的输出。
语法: order(vec, decreasing = TRUE)
参数:
- vec – 要按降序排列的数据框架列名
- decreasing – 将数据按降序排列的标志。
基础R中的Reduce方法也可以用来从数据框架的每一组中选择最高的n行。这个方法的输入是一个有两个参数的函数f,还有一个列表或向量vec,这个列表或向量要用函数f来进行缩减。R中的by()方法是用来将一个函数应用于数据框架的指定子集。这个方法的第一个参数是数据,第二个参数是应用函数的对象,第三个参数是函数。这里,head被用作使用方法调用的第三个参数指定的函数。它被用来指定数据框架中的n行组。
语法: by(df, df$col-name, FUN)
参数:
- df – 要应用函数的数据框架
- FUN – 要应用的函数
组合函数的应用可以总结为以下几点。
Reduce(rbind,by())
代码
# 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)
输出
方法2:使用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的形式返回的,包含返回的行的全部信息。原始数据框架的行号不会被保留。
代码
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函数的输出。
语法: order(vec, decreasing = TRUE)
参数 :
Vec – 要按降序排列的数据框架列名
decreasing – 按降序设置数据的标志
然后,可以使用data.table()方法将数据框架转换为数据表,并在setKey()方法中使用列名。key属性包含了在data.table中对数据进行分组的列名。
data.table(df, key = )
现在,head和.SD属性可以用来访问每个所取组的前n行。by参数包含了分组的列。head方法的参数是.SD和整数值n。
df[ , head(.SD, 3), by =]
代码
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)
输出