【发布时间】:2018-08-27 07:21:22
【问题描述】:
我之前问过一个类似的问题,但我需要一些进一步的输出并决定发布一个新问题。
我有一个这样的 data.table 对象:
library(data.table)
cells <- c(100, 1,1980,1,0,1,1,0,1,0,
150, 1,1980,1,1,1,0,0,0,1,
99 , 1,1980,1,1,1,1,0,0,0,
899, 1,1980,0,1,0,1,1,1,1,
789, 1,1982,1,1,1,0,1,1,1 )
colname <- c("number","sex", "birthy", "2004","2005", "2006", "2007", "2008", "2009","2010")
rowname <- c("1","2","3","4","5")
y <- matrix(cells, nrow=5, ncol=10, byrow=TRUE, dimnames = list(rowname,colname))
y <- data.table(y, keep.rownames = TRUE)
2004 列中的值 1 表示此人在 2004 年连续投保。前 3 年投保的人员可以参与研究。我需要这个 data.table 的一个子集,其中包含满足以下条件的所有观察结果:2004+2005+2006 = 3 或 2005+2006+2007 = 或 2006+2007+...
#using melt and rle function to restrucure the data
tmp <- melt(y, id = "rn", measure.vars = patterns("^20"),
variable.factor = FALSE, variable.name = "year")[, rle(value), by = rn]
#subset data based on condition, keeping only the first relevant sequence
tmp2 <- tmp[(values == 1 & lengths >= 3), .(rn,lengths)][, .SD[1,], by=rn]
##selecting only rows with value=1 and min 3 in a row
##keeping only the variable rn
tmp3 <- tmp[values == 1, which(max(lengths) >= 3), by = rn]$rn
##using the row-number to select obersvations from data.table
##merging length of sequence
dt <- merge(y[as.integer(tmp3)],tmp2, by="rn")
如果它们不是序列的一部分,有没有办法将所有 1 变为 0?例如 rn==4 变量“2005”需要为零。
我还需要一个包含序列开始年份的新变量“begy”。例如rn==5 和begy==2004。任何建议将不胜感激...
【问题讨论】:
-
拜托,如果有多个时期,你能指定预期的结果是什么。例如,
rn == 5有一个周期从 2004 年开始,第二个周期从 2008 年开始。
标签: r select data.table sequence