R语言中两种筛选数据文件中不固定个数的最大几个数据的方法

        最近做数据处理中遇到了一个筛选数据的问题。有两个数据文件,一个是原始数据文件,每个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)
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值