Re: [問題] 想利用data.table將Rawdata切割欄位

看板R_Language作者 (攸藍)時間9年前 (2015/02/23 21:05), 9年前編輯推噓5(506)
留言11則, 4人參與, 最新討論串2/4 (看更多)
> [問題敘述]: > 各位前輩們好, > 小弟有一筆資料大約為500MB左右, > 因這筆資料為原始檔案, > 還沒將欄位定義好, > 所以小弟想詢問如何讀入data.table後, > 在將欄位進行切割? >> > example: > var1 > 1 001female 2019920404 > 2 002male 3019920505 > 3 003male 4019920606 > 4 004female 5019920707 >> > 希望可以透過欄位切割後變成: > id sex income birthday > 1 001 female 20 19920404 > 2 002 male 30 19920505 > 3 003 male 40 19920606 > 4 004 female 50 19920707 手癢寫了一下@@ code: library(data.table) library(magrittr) dat = fread("001female2019920404\n002male 3019920505\n003male 4019920606\n004female5019920707\n", sep="\n", sep2="", header=FALSE) library(Rcpp) library(inline) sourceCpp(code = ' #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] List dat_split_f( std::vector< std::string > strings, NumericVector loc) { int loc_len = loc.size(), num_strings = strings.size(); List output(num_strings); for( int j=0; j < num_strings; j++ ) { std::vector< std::string > tmp; for (int i=0; i < loc_len-1; i++) tmp.push_back( strings[j].substr(loc[i], loc[i+1] - loc[i]) ); output[j] = tmp; } return output; }') # 第二個input 第一個固定是0 第二個是第一個字串結束位置 # 第三個是第二個字串結束位置,依此類推,有k個column放k+1個值 # 這個可以用手算,也可以用regular expression去找對應位置,自行定奪 # 補充: 用C++邏輯想是,前k個是每個字串開始位置,最後一個是總長度 dat_split = dat_split_f(dat[[1]], c(0, 3, 9, 11, 19)) %>% do.call("rbind", .) %>% data.table() # 之後自行再把需要轉成數字的chr轉成numeric就好 測試一下40萬個row dat = fread(paste0(rep("001female2019920404\n002male 3019920505\n003male 4019920606\n004female5019920707\n", 100000), collapse=""), sep="\n", sep2="", header=FALSE) tt = proc.time() dat_split = dat_split_f(dat[[1]], c(0, 3, 9, 11, 19)) %>% do.call("rbind", .) %>% data.table() proc.time() - tt # user system elapsed # 3.34 0.01 3.50 四百萬個ROW大概是67秒 CPU: Intel Celeron B830@1.80G in windows 7 64bit with R 3.1.2 還要更快可以找我的文章(R_Language #1JiQHkrP),在Rcpp中加入openmp加速 Reference: http://gallery.rcpp.org/articles/strings_with_rcpp/ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.230.162.193 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1424696746.A.6B3.html ※ 編輯: celestialgod (125.230.162.193), 02/23/2015 21:30:39

02/23 22:33, , 1F
推~晚點來試看看
02/23 22:33, 1F

02/23 22:38, , 2F
非常感謝!我會在試試看!!
02/23 22:38, 2F

02/24 13:54, , 3F
錯誤在eval(expr, envir, enclos) : basic_string
02/24 13:54, 3F

02/24 13:55, , 4F
我是使用OSX 的 R 3.1.2 請問一下是系統問題嗎?
02/24 13:55, 4F
可能是compiler的差異,我稍微GOOGLE一下,Rcpp在OS有使用上的問題

02/24 19:35, , 5F
奇怪了@@,我剛剛使用win7 64bit R3.1.2也不行
02/24 19:35, 5F
請問過去有使用過Rcpp嗎? 若沒有,可以在 http://tinyurl.com/q5ozbmc 找到相關資訊 要不要先確定一下是否有安裝成功,並且安裝Rtools, 把Rtools的路徑加入你的系統Path中? 不行用是否有出現什麼錯誤訊息? 最簡單的解決方法找一台linux電腦來用~~

02/24 20:01, , 6F
c版友,下次您貼這種優質好文的時候別把原文刪了啦,
02/24 20:01, 6F

02/24 20:01, , 7F
這樣收精華區以及別人查閱都會比較方便。
02/24 20:01, 7F
對不起,我下次會注意

02/24 20:12, , 8F
幹嘛道歉啦 XD
02/24 20:12, 8F
感覺不用對不起開頭,不知道要用什麼...

02/24 20:23, , 9F
推c大熱心且優質文章! 第一次使用rcpp,我會先看相關
02/24 20:23, 9F
第一次使用的話,我可以先給你一個簡單的guide windows上的使用,主要要先有Rtools,可以在R網站上找到, 最簡單的方式直接GOOGLE 第二個就是下載 Redmond Path 這個軟體比較容易去更改系統路徑 第三個建議R跟Rtools都安裝在C底下 例如:C:\R\R-3.1.2 or C:\R\Rtools 最後要把Rtools的路徑加入path,就利用Redmond Path 把Rtools下的兩個路徑加入,以上面建議為例 c:\R\Rtools\gcc-4.6.3\bin c:\R\Rtools\bin 做完之後,基本上Rcpp就可以正常運作了 至於linux就更簡單了,安裝完R,我記得就能用了

02/24 20:26, , 10F
耶,謝謝你貼原文回來!
02/24 20:26, 10F
為了您的一句話阿! ※ 編輯: celestialgod (125.230.162.193), 02/24/2015 20:29:42

03/01 12:08, , 11F
後來發現str_sub {stringr}比substr快不少
03/01 12:08, 11F
文章代碼(AID): #1KwoMgQp (R_Language)
文章代碼(AID): #1KwoMgQp (R_Language)