Re: [问题] 一笔资料转多笔

楼主: celestialgod (天)   2016-12-01 19:37:17
※ 引述《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
作者: cywhale (cywhale)   2016-12-01 21:57:00
#1N_NLOIo data.table::foverlaps可做但程式可能不会较少ya..so.. and maybe melt is faster ^_^
作者: criky (2501-2)   2016-12-01 22:42:00
感谢板主用多种方法解答,不过id=1和2都缺了中间几笔资料start_y到end_y中间的资料,id=1是101,id=2是102pipe R那篇的文章连结变404了 想学一下 >> 的用法 QQid=1少了y=101,s=1,2 这2笔,id=2少了y=102,s=1,2这2笔然后id=2多了y=101,s=1 , y=103,s=2 这2笔文章可以进去了 谢谢!y=学年 s=1#上学期 s=2#下学期

Links booklink

Contact Us: admin [ a t ] ucptt.com