→ 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