Это, кажется, делает более или менее то, что вы просите (по крайней мере, если переменные являются числовыми).Будут лучшие способы
smallvisit <- ae_dset[ ae_dset$visit <= 2, ]
bigvisit <- ae_dset[ ae_dset$visit > 2, ]
nams <- c("patid", "bodysys", "prefterm")
smallvisitsorted <- smallvisit[ do.call( order, smallvisit[nams] ), ]
smallvisitsplit <- split( smallvisitsorted, smallvisitsorted[nams], drop=TRUE )
last <- function(a){ tail( a, 1 ) }
smallvisitlast <- as.data.frame( t( sapply( smallvisitsplit, last ) ) )
mergedvisit <- merge( bigvisit, smallvisitlast, by=nams, all.x=TRUE )
new_ae_dset <- mergedvisit[ mergedvisit$severity.x > mergedvisit$severity.y |
is.na( mergedvisit$severity.y ) , ]
Например, если ae_dset
выглядит как
patid bodysys prefterm visit severity
1 5 9 2 1 3
2 22 1 5 5 2
3 11 2 9 3 3
4 11 2 9 2 2
5 22 3 3 3 1
6 3 4 6 1 2
7 22 3 3 2 2
8 22 3 3 4 3
9 11 2 9 1 1
10 3 3 6 5 2
11 4 3 7 7 3
, то при использовании этого кода new_ae_dset
будет выглядеть
patid bodysys prefterm visit.x severity.x visit.y severity.y
1 3 3 6 5 2 NA NA
2 4 3 7 7 3 NA NA
3 11 2 9 3 3 1 1
4 22 1 5 5 2 NA NA
6 22 3 3 4 3 2 2