R_Language 板


LINE

※ 引述《f496328mm (为什麽会流泪)》之铭言: : 问题一 : 我要读的是笔记本txt档 : 档案太大无法先用excel处理 : 我的分隔符号有多个 请问要怎麽写?? : 我的code : read.table("d:\\xxx.txt" ,sep=";", fill=T, quote="") : 我想要用 ; 和 空格 当作分隔符号 未来可能再增加 假设你资料长这样,可以先用regex把分隔符号抓出来,再用fread处理: sam 18; boy paul; 20 boy charlotte; 21; girl christy 17 girl 好读版:http://pastebin.com/QjwNiyNK 备注很长,不想看就转下一页吧,无所谓的murmur XD (备注:library後面注解是该套件会用到的函数,我尽量减少使用奇怪的函数, %>>%部分,我这里用法几乎都跟%>%一样,去看magrittr介绍即可, 有兴趣了解更多,再到作者网站看,%>>%多了不少好用的功能, data.table主要是用fread,data.table跟setnames都可以分别用 data.frame, `names<-`这两个函数取代,rlply可以用replicate取代 mutate也可以用base的transform取代,str_c跟paste一样, str_replace_all只是把gsub原本放字串的位置移到第一个,方便pipe, 还有其他问题或是不会取代函数的话,再推文或是回文发问吧, 至於为什麽要用其他函数,其函数有其他好处加上习惯,甚至只是因为style问题, 就不在程式中做取代了) code: library(data.table) # fread, data.table, setnames library(pipeR) # %>>% library(plyr) # rlply library(dplyr) # mutate library(stringr) # str_replace_all, str_c readLines(textConnection('sam 18; boy paul; 20 boy charlotte; 21; girl christy 17 girl')) %>>% str_replace_all("([a-zA-Z0-9]);? ", "\\1,") %>>% # str_replace_all比gsub适合用在pipeR str_c(collapse = "\n") %>>% fread %>>% # str_c = paste setnames(c("name", "age", "sex")) %>>% mutate(age = as.integer(age)) # name age sex # 1 sam 18 boy # 2 paul 20 boy # 3 charlotte 21 girl # 4 christy 17 girl 用两百万个row测试看看: # data generation textData <- raply(5e5, 'sam 18; boy paul; 20 boy charlotte; 21; girl christy 17 girl') %>>% str_c(collapse = "\n") library(microbenchmark) # microbenchmark microbenchmark(test = textData %>>% str_replace_all("([a-zA-Z0-9]);? ", "\\1,") %>>% str_c(collapse = "\n") %>>% fread %>>% setnames(c("name", "age", "sex")) %>>% mutate(age = as.integer(age)), times = 10L) # Unit: seconds # expr min lq mean median uq max neval # test 4.489137 4.520529 4.528179 4.529275 4.543055 4.557189 10 平均一次4.5秒左右,全距也很小,所以两百万列不是问题 : ========================================================== : 问题二 : 我的资料中 有些地方没有值 所以当初在存的时候就直接忽略 连空白都没留 : 像这样: : sam;16;boy; 2015:00:09:59 : green;18;gril : paul;20; 2015:00:09:59 : 第一行是name : 第二行是age : 第三行是性别 : 但是paul没有记录到 所以直接记录到第四行的time : green的time也没记录到 : 想问有没有什麽方法解决 我目前只想到比较笨的方法 : 给它特定范围去判断 像性别不是boy就是gril 出现其他就给他NA : 还有 : 这样读资料也会因为每列资料col都不一样 有的时候会出现问题 : 是可以读成文字再去慢慢拆开 不过有点笨就是了 : 最後想问如果读资料量上百万笔 : 还是用read.table吗? : 有没有比较好的函数专门处理large data? : 谢谢 一样用regex处理即可,速度也是相当快: pattern <- str_c("([a-z]*);?\\s*", "(\\d*)?;?\\s*", "(boy|girl)?;?\\s*", "(\\d{4}:\\d{2}:\\d{2}:\\d{2})?") # 第一个是第一栏位,第二个是第二栏位,依此类推 readLines(textConnection('sam;16;boy; 2015:00:09:59 green;18;girl; paul;20; 2015:00:09:59 charlotte; 21;')) %>>% str_replace_all(pattern, "\\1, \\2, \\3, \\4") %>>% str_replace_all(", , , ", "") %>>% str_c(collapse = "\n") %>>% fread(na.string="") %>>% setnames(c("name", "age", "sex", "time")) %>>% mutate(age = as.integer(age)) # name age sex time # 1 sam 16 boy 2015:00:09:59 # 2 green 18 girl <NA> # 3 paul 20 <NA> 2015:00:09:59 # 4 charlotte 21 <NA> <NA> # 这里要为什麽要取代", , , ",我暂时想不出来为什麽 # 这里不知道为什麽经过regex後,每一列会多出三个逗号,让我匪夷所思QQ # 用两百万个row测试看看: # data generation textData <- raply(5e5, 'sam;16;boy; 2015:00:09:59 green;18;girl; paul;20; 2015:00:09:59 charlotte; 21;') %>>% str_c(collapse = "\n") library(microbenchmark) microbenchmark(test = readLines(textConnection(textData)) %>>% str_replace_all(pattern, "\\1, \\2, \\3, \\4") %>>% str_replace_all(", , , ", "") %>>% str_c(collapse = "\n") %>>% fread(na.string="") %>>% setnames(c("name", "age", "sex", "time")) %>>% mutate(age = as.integer(age)), times = 10L) # Unit: seconds # expr min lq mean median uq max neval # test 10.93214 10.9493 10.9683 10.96072 10.98294 11.04314 10 平均一次11秒左右,全距也很小,所以两百万列不是问题 最後murmur,这个资料真的长得很丑,我花了一小时才把这篇打完 还在测试不用regular expression的方法,能多快 发现读一次档案还是要80秒,实在太慢,最後就不PO上来了 这里推荐一个网站学regex: http://regexone.com/ 题外话:这一篇文章值 185 Ptt币 XDD -- R资料整理套件系列文: magrittr #1LhSWhpH (R_Language) http://tinyurl.com/j3ql84c data.table #1LhW7Tvj (R_Language) http://tinyurl.com/hr77hrn dplyr(上) #1LhpJCfB (R_Language) http://tinyurl.com/jtg4hau dplyr(下) #1Lhw8b-s (R_Language) tidyr #1Liqls1R (R_Language) http://tinyurl.com/jq3o2g3 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.218.152.118
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1462040172.A.2C0.html ※ 编辑: celestialgod (180.218.152.118), 05/01/2016 02:34:01
1F:推 f496328mm: 感谢!这应该算是高阶写法吧,又学到新东西啦 05/01 10:58







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP