作者celestialgod (天)
看板R_Language
標題Re: [問題] 資料整理問題(更改)
時間Wed Sep 13 23:22:05 2017
※ 引述《tony1331 (BLUE)》之銘言:
: [問題類型]:
: 我想用R 做某件事情,但是我不知道要怎麼用R 寫出來
: [軟體熟悉度]:
: 寫過程式,R 是我的第一次
: [問題敘述]:
: http://i.imgur.com/yKt85T3.jpg
: 目前只會單列unique,想把每列都unique~
: 懇請教導,感謝~
: 不好意思手機發文好像怪怪的
: -----
: Sent from JPTT on my Asus ASUS_Z012DA.
不用套件有點麻煩,懶得寫XD,下面是最簡單的作法:
# 好讀板:
https://pastebin.com/67j92ptN
library(data.table)
library(pipeR)
# data generation
numRows <- 3e4
numCols <- 8
s <- matrix(NA_integer_, numRows, numCols)
idx <- sample(numCols, numRows, TRUE)
for (i in 1:numCols)
s[idx == i, 1:i] <- sample(42, i * sum(idx == i), TRUE)
time <- seq(ISOdate(2017, 9, 12) - numRows*3600, ISOdate(2017, 9, 12),
by = "hour")
DT <- data.table(time = head(time, numRows), s)
# time V1 V2 V3 V4 V5 V6 V7 V8
# 1: 2014-04-11 12:00:00 31 26 20 19 7 NA NA NA
# 2: 2014-04-11 13:00:00 4 5 4 4 7 NA NA NA
# 3: 2014-04-11 14:00:00 17 17 32 36 NA NA NA NA
# 4: 2014-04-11 15:00:00 2 23 25 28 41 14 32 10
# 5: 2014-04-11 16:00:00 40 33 25 27 29 NA NA NA
# ---
# 29996: 2017-09-12 07:00:00 36 13 7 38 21 34 36 NA
# 29997: 2017-09-12 08:00:00 18 NA NA NA NA NA NA NA
# 29998: 2017-09-12 09:00:00 8 9 35 32 12 18 3 NA
# 29999: 2017-09-12 10:00:00 41 10 22 32 28 39 17 31
# 30000: 2017-09-12 11:00:00 21 21 NA NA NA NA NA NA
# 主程式
# 第一個問題
st <- proc.time()
melt(DT, 1, 2:9) %>>% na.omit("value") %>>%
`[`(j = .(value = unique(value), idx = 1:uniqueN(value)), by = .(time)) %>>%
dcast(time ~ idx, value.var = "value")
proc.time() - st
# user system elapsed
# 0.68 0.00 0.71
# time 1 2 3 4 5 6 7 8
# 1: 2014-04-11 12:00:00 31 26 20 19 7 NA NA NA
# 2: 2014-04-11 13:00:00 4 5 7 NA NA NA NA NA
# 3: 2014-04-11 14:00:00 17 32 36 NA NA NA NA NA
# 4: 2014-04-11 15:00:00 2 23 25 28 41 14 32 10
# 5: 2014-04-11 16:00:00 40 33 25 27 29 NA NA NA
# ---
# 29996: 2017-09-12 07:00:00 36 13 7 38 21 34 NA NA
# 29997: 2017-09-12 08:00:00 18 NA NA NA NA NA NA NA
# 29998: 2017-09-12 09:00:00 8 9 35 32 12 18 3 NA
# 29999: 2017-09-12 10:00:00 41 10 22 32 28 39 17 31
# 30000: 2017-09-12 11:00:00 21 NA NA NA NA NA NA NA
# 第二個問題
st <- proc.time()
melt(DT, 1, 2:9) %>>% na.omit("value") %>>%
`[`(j = .(cnt = .N), by = .(time, value))
proc.time() - st
# user system elapsed
# 0.14 0.03 0.17
# time value cnt
# 1: 2014-04-11 12:00:00 31 1
# 2: 2014-04-11 13:00:00 4 3
# 3: 2014-04-11 14:00:00 17 2
# 4: 2014-04-11 15:00:00 2 1
# 5: 2014-04-11 16:00:00 40 1
# ---
# 128084: 2017-09-11 03:00:00 29 1
# 128085: 2017-09-11 16:00:00 6 1
# 128086: 2017-09-11 22:00:00 24 1
# 128087: 2017-09-12 05:00:00 4 1
# 128088: 2017-09-12 10:00:00 31 1
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.62.243
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1505316129.A.087.html
推 tony1331: 謝謝,再請問如果時間是rowname的話,那會比較簡單嗎? 09/14 11:35
→ clansoda: 沒有比較簡單 時間在rowname還是要拉出來才能melt 09/14 11:51
→ clansoda: datatable的形式也沒有rowname這個概念 09/14 11:51
rownames這概念,我一直不覺得有什麼用... 我基本上也沒再用rownames
而且其實rownames in somehow也是一種變數,沒必要放到rownames去
推 tony1331: 謝謝 我再研究~ 09/14 19:38
→ clansoda: 你喜歡用rowname也可以用Dataframe來做 09/14 19:41
→ clansoda: 配上dplyr + tidyr應該效果一樣 時間應該不會差太多 09/14 19:42
你用melt跟用dplyr+tidyr效果是一樣的,時間的話,我相信data.table還是會快一點
→ tony1331: .jpg 09/14 21:14
你少打了一個點....
※ 編輯: celestialgod (118.170.62.243), 09/14/2017 21:28:35
→ tony1331: 感謝c大教導~~ 09/14 22:05
→ clansoda: 我也相信比較快,但是他喜歡rowname 但是rowname也要 09/14 22:16
→ clansoda: 變成column才能melt所以本質不變 09/14 22:16