大家在做数据处理的时候,都会遇到这样的问题,一个表中同一个字段会对应多个值,但我们只想取出第一个值,或者想取出第一行的值。
在R中,使用包可以很方便的对其进行处理。
R语言的dplyr包实现
在a数据中,当一个SKU存在多条记录,选取 最小数量,日期最新的那个SKU。
方法1、rank()函数
a$Quantity <- as.numeric(a$Quantity)
a$Date <- lubridate::ymd(a$Date)
a %>% dplyr::group_by(SKU) %>% dplyr::arrange(Quantity,desc(date)) %>% dplyr::mutate(rn=rank(desc(Date),ties.method='first')) %>% dplyr::filter(rn==1)
arrange中,默认为升序。如需降序,需desc。
ties.method='first',SKU按照顺序排列。否则,序号不连续。
方法2、row_number()函数
a %>% dplyr::group_by(SKU) %>% arrange(Quantity,desc(Date)) %>% dplyr::mutate(index=row_number()) %>% dplyr::filter(index==1)
方法3、seq()函数
a %>% dplyr::group_by(SKU) %>% dplyr::arrange(QUANTITY,desc(Date)) %>% mutate(id=seq(1,length(SKU))) %>% dplyr::filter(id==1)
R语言的data.table包实现
library(data.table) #加载数据包
a<- as.data.table(a) #将数据框转成data.table格式
class(a) #查看类型
a[, rn := rank(- Quantity), by = 'SKU'] #新增一列rn,按照SKU分组,Quantity升序排列
a[order(SKU, rn)] #order函数
a[rn == 1][order(SKU)] #取出rn = 1的即为所需的数据
网友评论