使用melt作为评论,我会这样做:
# this part is as replied from the question
set.seed(2)
fill = data.table(n=1:7)
Tp=3
for(t in 1:Tp){
set(x = fill, j = paste0('prod1vint',t), value = sample(0:10,7))
}
fill[1,paste0('prod1vint',3):=0]
fill[5,paste0('prod1vint',2):=0]
fill[5,paste0('prod1vint',3):=0]
for(t in 1:Tp){
fill[,paste0('prod1vint',t,'prm'):=get(paste0('prod1vint',t))]
}
fill[1,paste0('prod1vint',1,'prm'):=0]
fill[2,paste0('prod1vint',2,'prm'):=1]
fill[5,paste0('prod1vint',3,'prm'):=1]
fill[7,paste0('prod1vint',3,'prm'):=2]
# NEW CODE
fill.melt <- reshape2::melt(fill, id.vars = c('n'))
fill.melt$intpart <- sapply(fill.melt$variable,
function (x)
{stringr::str_extract(gsub('prod1','',x),
'\\d')})
fill.melt$prmpart <- ifelse(grepl('prm', fill.melt$variable), 'prm','noprm')
fill.cast <- reshape2::dcast(fill.melt, n+intpart ~ prmpart , value.var = 'value')
fill.cast <- as.data.table(fill.cast)
t=3
tmp <- fill.cast[
((intpart >= t & prm <= noprm) | (intpart < t & prm == noprm)),]
ns <- unique(tmp$n)[table(tmp$n) == t]
fill[n %in% ns,]