Я задавал похожий вопрос раньше, но мне нужно еще кое-что узнать, и я решил опубликовать новый вопрос.
У меня есть объект 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)
значение 1 в столбце 2004 означает, что это лицо непрерывно застраховано в течение 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
.Любое предложение будет оценено ...