作者cywhale (cywhale)
看板R_Language
标题Re: [问题] 一笔资料转多笔
时间Thu Dec 1 23:49:59 2016
手痒也试了一下,就用data.table::foverlaps做
## data.table::foverlaps, reference:
#1N_NLOIo
library(data.table)
library(magrittr)
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') %>%
.[,{.(id=id,
start=as.numeric(paste(start_y,start_s,sep=".")),
end = as.numeric(paste(end_y,end_s,sep=".")))}] %>% setkey(start,end)
gt <- CJ(start_y=100:103, s=1:2) %>%
.[,{.(start=as.numeric(paste(start_y,s,sep=".")))}] %>% unique() %>%
.[,end:=start]
gx <- foverlaps(gt, dt, type="within", which=TRUE) %>%
.[which(!is.na(yid)),]
cbind(dt[gx$yid,.(id)], gt[gx$xid,.(start)]) %>% .[order(id),] %>%
.[,{.(id=id,
year=substr(start,1,nchar(start)-2),
s=substr(start,nchar(start),nchar(start))
)}]
# 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
※ 引述《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 的版本和套件版本资讯,
: 让版友更容易找出错误
:
: [关键字]:
:
: 选择性,也许未来有用
:
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.225.167.251
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1480607402.A.8BD.html
1F:推 celestialgod: 最後一行应该用tstrsplit就好 12/01 23:56
2F:推 celestialgod: CJ 好酷!! 12/01 23:57
3F:→ celestialgod: CJ在某种意义上是expand.grid,真是有趣的函数 12/01 23:59
4F:推 criky: 谢谢cy大,这篇解答好多括号= = 12/02 00:05
5F:→ cywhale: 忘了还有tstrsplit 感谢提醒~~ ^^ 12/02 00:07
6F:→ celestialgod: 我帮忙排成简单易懂的好了@@ 12/02 00:07
7F:→ celestialgod: 算了,跟我习惯不同XDD 12/02 00:08
8F:→ cywhale: XDD 没关系 括号Rstudio会take care 我也常看不懂 12/02 00:17
9F:→ cywhale: 别人的排版<-其实是自己怪,另推data.table J, SJ, CJ好用 12/02 00:18
10F:推 Edster: 你的排版真坚持 12/02 11:37