精華區beta R_Language 關於我們 聯絡資訊
[問題類型]: N*1的資料 轉換成M*16 [軟體熟悉度]: R初學 [問題敘述]: 原始資料(csv檔)資料大致是這樣: time1 a = 5 b = 70 c = "rest" ... ... time2 a = 8 b = 15 c = "rest_2" ... ... 想要以16列為單位整理成M*16的矩陣 第一列是col標題 和每列前面的a,b,c等是row標題 類似這樣: time a b c ... time1 5 70 "rest" time2 8 15 "rest_2" 有找一些指令好像都是以同col內同樣資料來分組 所以不太知道目前需要做的這功能要怎麼處理 手機發文,排版請見諒 感謝大家 ----- Sent from JPTT on my Xiaomi MI 5. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.91.168 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503389305.A.6A1.html ※ 編輯: playaround (223.140.91.168), 08/22/2017 16:09:03 ※ 編輯: playaround (223.140.91.168), 08/22/2017 16:11:05
andrew43: 原始的資料檔案是什麼樣的格式可以一併說明。08/22 16:14
andrew43: 否則回答你的解法說不定根本沒辦法套用。08/22 16:15
您好,檔案為csv檔 剛還有修改一下問題,再麻煩大大了 ※ 編輯: playaround (223.140.91.168), 08/22/2017 16:32:39 ※ 編輯: playaround (223.140.91.168), 08/22/2017 16:35:00
andrew43: 重點就在CSV裡頭長什麼樣。簡單貼一下?08/22 16:36
抱歉因為是內部系統下來的raw data,所以有沒辦法提供@@ 資料格式如範例那樣 每組是 第一列是time 後面15列都是a,b,c= 數字/字串 這樣多組連在一起 ※ 編輯: playaround (223.140.91.168), 08/22/2017 16:51:26 ※ 編輯: playaround (223.140.91.168), 08/22/2017 17:32:55 ※ 編輯: playaround (223.140.91.168), 08/22/2017 17:34:03
f496328mm: matrix,ncol=16試試08/22 17:36
f496328mm: 之後再自己設colname08/22 17:37
andrew43: matrix不能混雜數字和字串。大概還是data frame或list吧08/22 18:28
是XD 我單用matrix出來會得到奇怪的東西0.0
clsmbstu: 建立matrix時是可以混雜數字和字串,但接下來運算可能會08/22 21:47
clsmbstu: 產生奇怪的結果08/22 21:47
感謝各位大大都還特地發文指導@@ 我會先把各位提供的意見都先消化一下 之後如果還有問題的話再來請教各位 太感謝了 ※ 編輯: playaround (114.35.98.14), 08/23/2017 00:55:20 想再請教一下各位,不知道R語言對於資料量的處理效率是如何? 因為我在嘗試各位提供的方法時,發現把檔案丟進去處理 在下面console的地方等很久還是沒有>出現 想把過程中的一個階段的data也點出來看也常常是還在跑的空白XD 我的data全部約57萬筆 因為之前只有load過10萬筆內的資料去練習畫圖之類的而已 所以不知道是不是上到這個數字量的資料後 R在執行上就會比較需要時間? 或是可能只是我程式有地方沒改好XD ※ 編輯: playaround (114.35.98.14), 08/23/2017 03:13:54
f496328mm: 應該是程式不熟悉的問題 57萬筆不算大08/23 12:34
f496328mm: 我目前處理超過千萬的data 都很順08/23 12:35
了解 謝謝~ ※ 編輯: playaround (223.140.91.168), 08/23/2017 18:15:10
celestialgod: 看你用哪種方式,我的方法應該不至於跑超過三分鐘 08/23 18:31
> -------------------------------------------------------------------------- < 作者: andrew43 (討厭有好心推文後刪文者) 看板: R_Language 標題: Re: [問題] N*1資料 轉 a*b格式 時間: Tue Aug 22 19:00:01 2017 假如原始資料檔(以4列為一組為例)如下 #### data.txt begin #### time1 a = 5 b = 70 c = "rest" time2 a = 8 b = 15 c = "rest_2" #### data.txt end #### 我用字串的角度把資料取出再排入 data frame。 重點在於從各列的規格寫成 regular expression。 library(magrittr) txt <- readLines("data.txt", n = -1) n <- length(txt) ncol <- 4 # 之後自行修改成16 nrow <- n / ncol data.frame( time = txt[grep("^time[[:digit:]]+", txt)], a = gsub("^a = ([[:digit:]]+)", "\\1", txt[grepl("^a = [[:digit:]]", txt)]) %>% as.numeric, b = gsub("^b = ([[:digit:]]+)", "\\1", txt[grepl("^b = [[:digit:]]", txt)]) %>% as.numeric, c = gsub("^c = \"([[:print:]]+)\"", "\\1", txt[grepl("^c = \"[[:print:]]+\"", txt)]) ) 可得 data frame 'data.frame': 2 obs. of 4 variables: $ time: Factor w/ 2 levels "time1","time2": 1 2 $ a : num 5 8 $ b : num 70 15 $ c : Factor w/ 2 levels "rest","rest_2": 1 2 ※ 引述《playaround (打滾)》之銘言: : [問題類型]: : N*1的資料 轉換成M*16 : [軟體熟悉度]: : R初學 : [問題敘述]: : 原始資料(csv檔)資料大致是這樣: : time1 : a = 5 : b = 70 : c = "rest" : ... : ... : time2 : a = 8 : b = 15 : c = "rest_2" : ... : ... : 想要以16列為單位整理成M*16的矩陣 : 第一列是col標題 : 和每列前面的a,b,c等是row標題 : 類似這樣: : time a b c ... : time1 5 70 "rest" : time2 8 15 "rest_2" : 有找一些指令好像都是以同col內同樣資料來分組 : 所以不太知道目前需要做的這功能要怎麼處理 : 手機發文,排版請見諒 : 感謝大家 : ----- : Sent from JPTT on my Xiaomi MI 5. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.222.1 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503399605.A.EEB.html > -------------------------------------------------------------------------- < 作者: f496328mm (123) 看板: R_Language 標題: Re: [問題] N*1資料 轉 a*b格式 時間: Tue Aug 22 22:30:07 2017 ※ 引述《playaround (打滾)》之銘言: : [問題類型]: : N*1的資料 轉換成M*16 : [軟體熟悉度]: : R初學 : [問題敘述]: : 原始資料(csv檔)資料大致是這樣: : time1 : a = 5 : b = 70 : c = "rest" : ... : ... : time2 : a = 8 : b = 15 : c = "rest_2" : ... : ... : 想要以16列為單位整理成M*16的矩陣 : 第一列是col標題 : 和每列前面的a,b,c等是row標題 : 類似這樣: : time a b c ... : time1 5 70 "rest" : time2 8 15 "rest_2" : 有找一些指令好像都是以同col內同樣資料來分組 : 所以不太知道目前需要做的這功能要怎麼處理 : 手機發文,排版請見諒 : 感謝大家 : ----- : Sent from JPTT on my Xiaomi MI 5. library(data.table) library(dplyr) setwd("d:/") data = readLines("test.txt", n = -1) var.name = data[2:4] %>% substr(.,1,1) data = data %>% sub('a = ','',.) %>% sub('b = ','',.) %>% sub('c = ','',.) %>% gsub('"','',.) data = matrix(data,ncol=2) %>% t %>% data.table colnames(data) = c('time',var.name) data #---------------------------------------------------- 執行結果 http://imgur.com/Sjdnc64 先用 matrix 處理,最後再轉成 data.table,之後變數型態再改成自己要的就好了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.52.141 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503412210.A.D18.html ※ 編輯: f496328mm (114.36.52.141), 08/22/2017 22:31:18 ※ 編輯: f496328mm (114.36.52.141), 08/22/2017 22:31:37 ※ 編輯: f496328mm (114.36.52.141), 08/22/2017 22:44:01 > -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] N*1資料 轉 a*b格式 時間: Tue Aug 22 23:04:10 2017 ※ 引述《playaround (打滾)》之銘言: : [問題類型]: : N*1的資料 轉換成M*16 : [軟體熟悉度]: : R初學 : [問題敘述]: : 原始資料(csv檔)資料大致是這樣: : time1 : a = 5 : b = 70 : c = "rest" : ... : ... : time2 : a = 8 : b = 15 : c = "rest_2" : ... : ... : 想要以16列為單位整理成M*16的矩陣 : 第一列是col標題 : 和每列前面的a,b,c等是row標題 : 類似這樣: : time a b c ... : time1 5 70 "rest" : time2 8 15 "rest_2" : 有找一些指令好像都是以同col內同樣資料來分組 : 所以不太知道目前需要做的這功能要怎麼處理 : 手機發文,排版請見諒 : 感謝大家 : ----- : Sent from JPTT on my Xiaomi MI 5. 給另外一種方法參考,然後教你怎麼做自動轉型XD dataStr <- 'time1 a = 5 b = 70 c = "rest" time2 a = 8 b = 15 c = "rest_2" time3 a = 1 b = 45 c = "rest_3"' # 等同於前兩位用readLines讀檔案的txt變數 txt <- strsplit(dataStr, "\n")[[1]] # 把time也取代成同樣的格式 txt[grepl("time", txt)] <- paste0("time = ", txt[grepl("time", txt)]) # 把每一列切割成 column name跟value兩個,然後用cbind合併全部分割的資料 out <- do.call(cbind, strsplit(txt, "\\s+=\\s+")) # 取得column names columnNames <- unique(out[1, ]) # 把每一個column對應的value取成一個list columnList <- lapply(columnNames, function(colname){ type.convert(out[2 , out[1, ] == colname]) # 取出對應名字的值並做自動轉型 }) # 確定每一個欄位長度都一樣 if (length(unique(sapply(out, length))) != 1) stop("每個欄位的長度不一樣,請檢查資料") # 給名字 names(columnList) <- columnNames # 轉成data.frame resultDf <- as.data.frame(columnList) # time a b c # 1 time1 5 70 "rest" # 2 time2 8 15 "rest_2" # 3 time3 1 45 "rest_3" > str(resultDf) 'data.frame': 3 obs. of 4 variables: $ time: Factor w/ 3 levels "time1","time2",..: 1 2 3 $ a : int 5 8 1 $ b : int 70 15 45 $ c : Factor w/ 3 levels "\"rest\"","\"rest_2\"",..: 1 2 3 難得一篇完全沒用套件XD 套件版: library(data.table) library(stringr) library(pipeR) txt <- strsplit(dataStr, "\n")[[1]] txt[str_detect(txt, "time")] <- str_c("time = ", txt[str_detect(txt, "time")]) outDf <- txt %>>% str_detect("time") %>>% cumsum %>>% cbind(do.call(rbind, str_split(txt, "\\s+=\\s+"))) %>>% data.table %>>% setnames(c("id", "var", "value")) %>>% `[`(j = id := NULL) %>>% `[`(j = eval(names(.)) := lapply(.SD, type.convert)) # a b c time # 1: 5 70 "rest" time1 # 2: 8 15 "rest_2" time2 # 3: 1 45 "rest_3" time3 > str(outDf) Classes ‘data.table’ and 'data.frame': 3 obs. of 4 variables: $ a : int 5 8 1 $ b : int 70 15 45 $ c : Factor w/ 3 levels "\"rest\"","\"rest_2\"",..: 1 2 3 $ time: Factor w/ 3 levels "time1","time2",..: 1 2 3 - attr(*, ".internal.selfref")=<externalptr> -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.253.88.5 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503414254.A.448.html ※ 編輯: celestialgod (111.253.88.5), 08/23/2017 01:04:19 > -------------------------------------------------------------------------- < 作者: celestialgod (天) 看板: R_Language 標題: Re: [問題] N*1資料 轉 a*b格式 時間: Wed Aug 23 19:57:03 2017 : 想再請教一下各位,不知道R語言對於資料量的處理效率是如何? : 因為我在嘗試各位提供的方法時,發現把檔案丟進去處理 : 在下面console的地方等很久還是沒有>出現 : 想把過程中的一個階段的data也點出來看也常常是還在跑的空白XD : 我的data全部約57萬筆 : 因為之前只有load過10萬筆內的資料去練習畫圖之類的而已 : 所以不知道是不是上到這個數字量的資料後 R在執行上就會比較需要時間? : 或是可能只是我程式有地方沒改好XD : ※ 編輯: playaround (114.35.98.14), 08/23/2017 03:13:54 : → f496328mm: 應該是程式不熟悉的問題 57萬筆不算大 08/23 12:34 : → f496328mm: 我目前處理超過千萬的data 都很順 08/23 12:35 讓我測試一下我的程式...,我測80萬筆都是三十秒內可以結束... 資料生成的程式: library(data.table) library(stringr) # 假設是八十萬筆 N <- 8e5L # 產生資料 DT <- data.table(time = str_c("time", 1L:N), a = sample(1L:20L, N, TRUE), b = sample(1L:100L, N, TRUE), c = sample(LETTERS, N, TRUE)) outStr <- str_c(DT$time, "\na = ", DT$a, "\nb = ", DT$b, "\nc = ", DT$c, collapse = "\n") write(outStr, "out.txt") 資料preview: http://imgur.com/kaB0fWq 資料preview: http://imgur.com/KKSgcjy 法一:http://imgur.com/Q7nv1GO 22秒解決 法二: http://imgur.com/TJFmXEd 17秒解決 電腦配備: i7-3770K@4.3GHz, DRR3-2133 8G * 4, 美光MX200 512GB -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9 data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.81.197 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503489426.A.815.html ※ 編輯: celestialgod (36.233.81.197), 08/23/2017 20:12:54