Re: [問題] 一筆資料轉多筆
※ 引述《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 的版本和套件版本資訊,
: 讓版友更容易找出錯誤
:
: [關鍵字]:
:
: 選擇性,也許未來有用
:
做兩次melt就可以達到你要的了,我不確定是否可以一次,看是否有高手寫得出來~~
library(data.table)
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_melt <- melt.data.table(DT, id = c(1,2,4), value.name = "s")
DT_melt2 <- melt.data.table(DT_melt, id = c(1,5), measure = 2:3,
value.name = "year")
DT_melt2[ , variable := NULL]
setcolorder(DT_melt2, c("id", "year", "s"))
setorderv(DT_melt2, names(DT_melt2))
unique(DT_melt2, by = names(DT_melt2))
# id year s
# 1: 1 100 1
# 2: 1 100 2
# 3: 1 102 1
# 4: 1 102 2
# 5: 2 101 1
# 6: 2 101 2
# 7: 2 103 1
# 8: 2 103 2
# 9: 3 101 2
# with pipeR
library(pipeR)
resDT <- melt.data.table(DT, id = c(1,2,4), value.name = "s") %>>%
melt.data.table(id = c(1,5), measure = 2:3, value.name = "year") %>>%
`[`(j = variable := NULL) %>>% setcolorder(c("id", "year", "s")) %>>%
setorderv(names(.)) %>>% unique(by = names(.))
print(resDT)
# id year s
# 1: 1 100 1
# 2: 1 100 2
# 3: 1 102 1
# 4: 1 102 2
# 5: 2 101 1
# 6: 2 101 2
# 7: 2 103 1
# 8: 2 103 2
# 9: 3 101 2
# tidyr + dplyr解法 (data.table不需要,DT可以是data.frame)
library(dplyr)
library(tidyr)
gather(DT, value, year, -id, -start_s, -end_s) %>>%
gather(ss, s, -id, -value, -year) %>>% select(id, year, s) %>>%
arrange(id, year, s) %>>% distinct(id, year, s)
# id year s
# 1 1 100 1
# 2 1 100 2
# 3 1 102 1
# 4 1 102 2
# 5 2 101 1
# 6 2 101 2
# 7 2 103 1
# 8 2 103 2
# 9 3 101 2
--
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.1480592241.A.CFC.html
推
12/01 21:57, , 1F
12/01 21:57, 1F
感覺沒有太大差異XD
※ 編輯: celestialgod (36.232.188.79), 12/01/2016 22:04:44
推
12/01 22:20, , 2F
12/01 22:20, 2F
推
12/01 22:42, , 3F
12/01 22:42, 3F
→
12/01 22:44, , 4F
12/01 22:44, 4F
→
12/01 22:50, , 5F
12/01 22:50, 5F
id=1,2缺幾筆? 你如果可以回文給我更詳細的例子,我會很樂意為你解答
Hi 我點我簽名檔的文章 進得去耶QQ
這裡再給一次網址:
http://chingchuan-chen.github.io/posts/2016/07/10/pipe-operators-in-R
補充:那篇文章的連結已經更新了
我之前部落格翻修不再用舊有的格式了,抱歉
推
12/01 23:10, , 6F
12/01 23:10, 6F
→
12/01 23:11, , 7F
12/01 23:11, 7F
→
12/01 23:11, , 8F
12/01 23:11, 8F
→
12/01 23:12, , 9F
12/01 23:12, 9F
阿阿 我知道你在說什麼了 我只做了轉表而已
我沒有注意這一點,抱歉,是我的失誤
我新發一篇回答了
※ 編輯: celestialgod (36.232.188.79), 12/02/2016 00:03:26
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
1
4
以下文章回應了本文:
問題
1
2
完整討論串 (本文為第 3 之 7 篇):
問題
1
4
問題
1
3
問題
4
9
問題
1
2
問題
4
10
問題
3
4
問題
3
20