R语言无法从dataframe提取Value列前7高值记录的问题求解
问题描述
我有一个结构如下的dataframe:
Date Type Value 2020-02-09 BUS 12 2020-02-09 ARS 226394 2020-02-09 ZED 27566 2020-02-09 YED 217098 2020-02-09 DKK 208463 2020-02-09 GBR 9320 2020-02-09 INY 156607 2020-02-09 CHI 19790 2020-02-09 IDR 24541 2020-02-09 KRW 1074419 2020-02-09 WOK 17250 2020-02-09 STR 12249 2020-02-09 HUF 43651 2020-02-09 HAD 45121
需求是生成由Value列数值最高的前7条记录构成的子集,多次尝试未得到正确结果。当前各列数据类型为:Date: chr、Type: chr、Value: int。
首先尝试的data.table代码如下:
new_df <- as.data.table(df)[order(Type, -Value), head(.SD, 7), by = Type
之后尝试用dplyr管道语法编写了两段代码:
new_df <- df %>% group_by(Type) %>% slice_max(order_by = Value, n = 7)
new_df <- df %>% group_by(Type) %>% slice_max(Value, n=7, with_ties = FALSE)
错误原因分析
- 核心逻辑错误:所有代码都加了分组逻辑(data.table的
by = Type、dplyr的group_by(Type)),执行逻辑是按Type分组后,每个组内取前7条,但当前数据中Type列每个值都唯一,每个分组仅1条记录,最终会返回全部14条数据,和「全表取Value最高的前7条」的需求完全不符。 - 语法问题:第一段data.table代码末尾缺少右括号,且排序优先级先按
Type排序,即使去掉分组也无法按Value降序取数。
正确实现方法
data.table 写法
不需要分组,直接按Value降序排序后取前7行即可:
library(data.table) new_df <- as.data.table(df)[order(-Value)][1:7]
也可以用head写法实现相同效果:
new_df <- as.data.table(df)[order(-Value), head(.SD, 7)]
dplyr 写法
去掉group_by(Type)分组逻辑,直接对全表做切片取数:
library(dplyr) # 严格取前7条,遇到并列值也只保留排序靠前的记录 new_df <- df %>% slice_max(order_by = Value, n = 7, with_ties = FALSE)
如果不需要排除并列值,可以去掉with_ties = FALSE参数,遇到Value相同的记录会全部保留。
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

