Re: [問題] 一筆資料轉多筆
前面那篇弄錯了XD
我寫一次正確板出來QQ
library(data.table)
library(pipeR)
DT <- fread("id start_y start_s end_y end_s
1 100 1 102 2
2 101 2 103 1
3 101 2 101 2")
DT[ , `:=`(start_ys = paste(start_y, start_s, sep = "-"),
end_ys = paste(end_y, end_s, sep = "-"))]
lookup_dt <- expand.grid(min(DT$start_y):max(DT$end_y), 1:2) %>>%
data.table %>>% `[`(j = y_s := paste(Var1, Var2, sep = "-"))
# lookup_dt <- CJ(min(DT$start_y):max(DT$end_y), 1:2) %>>%
# `[`(j = y_s := paste(V1, V2, sep = "-")) # 這樣做是一樣的
outDT <- DT[ , .(out_ys = lookup_dt$y_s[between(lookup_dt$y_s, start_ys,
end_ys)]), by = .(id)] %>>%
`[`(j = c("year", "s") := tstrsplit(out_ys, "-")) %>>%
`[`(j = out_ys := NULL)
# id year s
# 1: 1 100 1
# 2: 1 100 2
# 3: 1 101 1
# 4: 1 101 2
# 5: 1 102 1
# 6: 1 102 2
# 7: 2 101 2
# 8: 2 102 1
# 9: 2 102 2
# 10: 2 103 1
# 11: 3 101 2
# 改成下面這樣比較易懂:
all_ys <- expand.grid(min(DT$start_y):max(DT$end_y), 1:2) %>>%
with(paste(Var1, Var2, sep = "-"))
outDT <- DT[ , .(out_ys = all_ys[between(all_ys, start_ys,
end_ys)]), by = .(id)] %>>%
`[`(j = c("year", "s") := tstrsplit(out_ys, "-")) %>>%
`[`(j = out_ys := NULL)
這方法只適用data.table,data.table的between才可以比字串XD
如果出現Error: not compatible with requested type
代表說你的between不是用data.table的,所以會出問題
這時候請用 detach("package:dplyr", unload=TRUE)
如果還是不行就要看你的between是用到哪一個package
或是 乾脆在between前面加上 data.table::即可
※ 引述《criky (立業成家)》之銘言:
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: [軟體熟悉度]:
: 新手(沒寫過程式,R 是我的第一次)
: [問題敘述]:
: 若我有資料欄位如下:
:
: id start_y start_s end_y end_s
: 1 100 1 102 2
: 2 101 2 103 1
: 3 101 2 101 2
: year:
: 如何轉成下面的樣子:
: id year s
: 1 100 1
: 1 100 2
: 1 101 1
: 1 101 2
: 1 102 1
: 1 102 2
: 2 101 2
: 2 102 1
: 2 102 2
: 2 103 1
: 3 101 2 (只有一筆)
: 謝謝回答~
: [程式範例]:
:
:
: [環境敘述]:
:
: 請提供 sessionInfo() 的輸出結果,
: 裡面含有所有你使用的作業系統、R 的版本和套件版本資訊,
: 讓版友更容易找出錯誤
:
: [關鍵字]:
:
: 選擇性,也許未來有用
:
--
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.232.188.79
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1480607749.A.CA5.html
※ 編輯: celestialgod (36.232.188.79), 12/02/2016 00:03:02
※ 編輯: celestialgod (36.232.188.79), 12/02/2016 00:11:08
推
12/02 00:11, , 1F
12/02 00:11, 1F
是我眼殘QQ 如果我的解法有哪個函數不太懂
可以再推文問,我會再回答
推
12/02 00:15, , 2F
12/02 00:15, 2F
兩邊都有,你現在知道了XD,而且data.table的比較強大Orz
會想到這個,只是想到套件比版本可以這樣做:
packageVersion("MASS") < "7.9.1.2"
XDDD
※ 編輯: celestialgod (36.232.188.79), 12/02/2016 00:18:29
推
12/02 00:40, , 3F
12/02 00:40, 3F
→
12/02 00:41, , 4F
12/02 00:41, 4F
討論串 (同標題文章)