r实现大文本文件数据分组汇总的方法

上传人:xzh****18 文档编号:44598329 上传时间:2018-06-14 格式:PDF 页数:3 大小:345.71KB
返回 下载 相关 举报
r实现大文本文件数据分组汇总的方法_第1页
第1页 / 共3页
r实现大文本文件数据分组汇总的方法_第2页
第2页 / 共3页
r实现大文本文件数据分组汇总的方法_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《r实现大文本文件数据分组汇总的方法》由会员分享,可在线阅读,更多相关《r实现大文本文件数据分组汇总的方法(3页珍藏版)》请在金锄头文库上搜索。

1、R 实现大文本文件数据分组汇总的方法 使用 R 语言对文件数据分组汇总是很普遍的操作, 但有时我们会遇到比较大的文件, 这 类文件的计算结果较小,但源数据太大,无法全部放入内存进行计算,只能采用分批读取、 分批计算、 拼合结果的办法来解决。 下面用一个例子来说明 R 实现大文件数据分组汇总的方法。 有个 1G 的文件 sales.txt, 存储着大量订单记录, 我们要对 CLIENT 字段分组并对 AMOUNT字段汇总。该文件的列分割符为“t” ,前几行数据如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE 1 WVF Vip 5 440.0 2009-0

2、2-03 2 UFS Com 13 1863.4 2009-07-05 3 SWFR 2 1813.0 2009-07-08 4 JFS Pep 27 670.8 2009-07-08 5 DSG 15 3730.0 2009-07-09 6 JFE 10 1444.8 2009-07-10 7 OLF 16 625.2 2009-07-11 R 语言解决方案语言解决方案 1 con - file(“E: sales.txt“, “r“) 2 result=read.table(con,nrows=100000,sep=“t“,header=TRUE) 3 result-aggregate(r

3、esult,4,list(result,2),sum) 4 while(nrow(databatch-read.table(con,header=FALSE,nrows=100000,sep=“t“,col.names=c(“ORDERID“,“Group.1“,“SELLERID“,“x“,“ORDERDATE“)!=0) 5 databatch-databatch,c(2,4) 6 result-rbind(result,databatch) 7 result-aggregate(result,2,list(result,1),sum) 8 9 close(con) 部分计算结果部分计算结

4、果 Group.1 x 1 ARO 17981798 2 BDR 85584558 3 BON 51293129 4 BSF 287908788 5 CHO 23482348 代码解读:代码解读: 1 行:打开文件句柄。 2-3 行:读入第一批的十万条数据,分组汇总后存入 result。 4-8 行:循环读数。每批次读入十万行数据,存入 databatch 变量。然后取第 2 和第 4 个字段,即“CLIENT”和“AMOUNT” 。接着将 databatch 拼合到 result 中,再执行分组运算。 可以看到, 同一时刻只有 databatch 和result 会占用内存, 其中 data

5、batch有十万条记录,result 是汇总结果,而汇总结果通常较小,不会超出内存。 11 行:关闭文件句柄。 注意事项:注意事项: 关于数据框。R 语言的数据框不直接支持大文件,因此要用循环语句来辅助解决。具体的算法是:读一批数据,拼合到数据框 result,对 result 分组汇总,再读下一批数据。可以 看到,循环语句这部分的代码略显复杂。 关于列名。 由于第一行数据是列名, 因此第一批数据可以用 header=TRUE 直接设置列名, 但后续数据没有列名,所以要用 header=FALSE 来读数。使用 header=FALSE 时,默认的列名是 V1、V2,而分组汇总后的默认列名是

6、Group.1、x,因此还要用 col.names 来改名,这样才能使两者结构一致,方便后续的合并。列名这部分很容易出错,值得注意。 替代替代方案:方案: 同样的算法也可以用 Python、集算器、Perl 等语言来实现。和 R 语言一样,这几种语言都可以实现大文本文件的分组汇总,以及后续的结构化数据计算。下面简单介绍集算器和 Python 的解决方案。 集算器会自动分批处理数据,程序员无需用循环语句手工控制,因此代码非常简洁: A A 1 =file(“e:/sales.txt“).cursort() 2 =A2.groups(CLIENT;sum(AMOUNT) cursor 是集算器中用

7、于结构化数据计算的数据类型,和数据框的用法差不多,但对大文 件和复杂计算更擅长。另外,代码中的t 选项表示文件的第一行是列名,因此之后的计算 可以直接用列名,这一点比较方便。 Python 的代码结构和 R 差不多, 也是手工控制循环, 但 python 本身缺乏数据框或 cursor 等结构化数据类型,因此代码更底层些: 1 from itertools import groupby 2 from operator import itemgetter 3 result = 4 myfile = open(“E:sales.txt“,r) 5 BUFSIZE = 10240000 6 myfi

8、le.readline() 7 lines = myfile.readlines(BUFSIZE) 8 value=0 9 while lines: 10 for line in lines: 11 record=line.split(t) 12 result.append(record1,float(record3) 13 result=sorted(result,key=lambda x:(x0) #分组前的排序 14 batch= 15 for key, items in groupby(result, itemgetter(0): #使用 groupby 函数分组 16 value=0 17 for subItem in items:value+=subItem1 18 batch.append(key,value) #最后把汇总结果拼成二维数组 19 result=batch 20 lines = myfile.readlines(BUFSIZE) 21 myfile.close() 除了上述的二维数组,Python 也可以用第三方包来实现,比如 pandas 就有类似数据框 的结构化数据对象。pandas 可以简化代码,和 R 的算法差不多,但 pandas 对大文件的支持同样有限,仍然需要编写循环完成。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号