精華區beta R_Language 關於我們 聯絡資訊
> [問題敘述]: > 各位前輩們好, > 小弟有一筆資料大約為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
cywhale: 推~晚點來試看看 02/23 22:33
squallscer: 非常感謝!我會在試試看!! 02/23 22:38
squallscer: 錯誤在eval(expr, envir, enclos) : basic_string 02/24 13:54
squallscer: 我是使用OSX 的 R 3.1.2 請問一下是系統問題嗎? 02/24 13:55
可能是compiler的差異,我稍微GOOGLE一下,Rcpp在OS有使用上的問題
squallscer: 奇怪了@@,我剛剛使用win7 64bit R3.1.2也不行 02/24 19:35
請問過去有使用過Rcpp嗎? 若沒有,可以在 http://tinyurl.com/q5ozbmc 找到相關資訊 要不要先確定一下是否有安裝成功,並且安裝Rtools, 把Rtools的路徑加入你的系統Path中? 不行用是否有出現什麼錯誤訊息? 最簡單的解決方法找一台linux電腦來用~~
andrew43: c版友,下次您貼這種優質好文的時候別把原文刪了啦, 02/24 20:01
andrew43: 這樣收精華區以及別人查閱都會比較方便。 02/24 20:01
對不起,我下次會注意 ※ 編輯: celestialgod (125.230.162.193), 02/24/2015 20:08:59