Re: [問題] 一筆資料轉多筆

作者: HeroNoah   2016-12-01 23:17:47
criky 版友想要的結果:
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
總共有 11 筆資料
celestialgod 版友的結果:
# 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
總共有 9 筆資料
帳面上看起來少了2筆資料,
實際上是少了 4 筆
1 101 1
1 101 2
2 102 1
2 102 2
卻多了 2 筆
# 5: 2 101 1
# 8: 2 103 2
在這提供我的寫法:
library("data.table")
criky = data.table(
id = c(1, 2, 3),
start_y = c(100, 101, 101),
start_s = c(1, 2, 2),
end_y = c(102, 103, 101),
end_s = c(2, 1, 2)
)
id_year_semester = function(
id,
from,
to
){
x = seq(from = from, to = to, by = 0.5)
size_x = length(x)
data.table(
id = rep(id, size_x),
year = x %/% 1,
s = (x %% 1) * 2 + 1
)
}
criky[
,
list(
id = id,
from = start_y + (start_s - 1) * 0.5,
to = end_y + (end_s - 1) * 0.5
)
][
,
id_year_semester(id, from, to),
by = list(id, from, to)
][
,
list(id, year, s)
]
執行結果:
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
※ 引述《celestialgod (天)》之銘言:
: ※ 引述《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
作者: celestialgod (天)   2016-12-01 23:32:00
XD 看錯問題了 等等再補解法
作者: criky (2501-2)   2016-12-01 23:38:00
謝謝英雄哥,id被拿來作文章感覺怪怪的 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com