最近做数据处理中遇到了一个筛选数据的问题。有两个数据文件,一个是原始数据文件,每个ID有多条数据,总共有10w条数据;另一个文件是需要挑选的每个ID 对应的数据个数(例如ID为A0001需要挑选5条,A0002需要挑选10条……),需要挑选第一个文件中每个ID最大的前几个数据,总计2万条。
解决思路:
目前没找到一个合适的函数来直接一步到位解决这个问题。面对这样一个数据处理问题,我们首先要学会如何把问题进行分解。经过分析,可分三步:1、筛选出每一个ID的全部数据(subset()函数);2、筛选每个ID下的最大的几个数据(top_n()函数或者order()函数);3、把不同ID下筛选的最大的几个数据拼接(for()循环、rbind()函数)(其实就是引入了求1到100的的sum()的逻辑)。
####第一种思路####
library(dplyr)
library(readxl)
setwd("D:/data")
data1<-read_xlsx("data100000.xlsx") #原始数据100000行
data2<-read_xlsx("data700.xlsx",sheet="Sheet1") #索引数据700ID对应挑选的个数
datatotol<-read_xlsx("datatotol.xlsx",sheet = "Sheet1") #引入一个空文件,表头同data100000
for (i in 1:700) {
data3<-subset(data1,data1$ID==data2$ID[i]) #把每个ID下的数据挑出来
data4<-top_n(data3,data2$需要的数据个数[i],data3$提交时间) #挑出每个ID下需要的数据
datatotol<-rbind(datatotol,data4) #合并每个ID下的数据
if((as.integer(i/100)!=as.numeric(i/100))==F) print(i) #加个数据进度条
}
length(datatotol$ID) #可以查看验证挑选的数据是否为20000.
write.csv(datatotol,"datatotol20000.csv",na="",row.names = F) #导出筛选出的数据20000例
####第二种思路####
for (i in 1:700) {
data3<-subset(data1,data1$ID==data2$ID[i])
data4<-data3[order(data3$提交时间,decreasing=T)][1:data2$需要的数据个数[i]] #把每个ID下的数据降序排序后再挑选前几个,达到同样的效果。
datatotol<-rbind(datatotol,data4)
if((as.integer(i/100)!=as.numeric(i/100))==F) print(i)
}