Как выполнить преобразование данных, возникающих при лечении, в языке программирования S? - PullRequest
1 голос
/ 26 мая 2011

как бы вы сделали это в R? (это задача подготовки данных) Исходя из набора данных о неблагоприятных событиях, выведите возникающий при лечении неблагоприятный набор данных событий: Для каждой системы организма и предпочтительного термина, ряд для каждого пациента, такой что либо:

  1. Это неблагоприятное событие произошло в пост-базовый период, но не в базовом периоде, или
  2. Даже если событие произошло в базовом периоде, оно произошло после базовой линии с более высокой степенью тяжести, чем наблюдалось во время базовый

Переменные:

severity = 1 , 2 , 3 (integer code for mild moderate severe)
patid visit bodysys prefterm
Baseline rows are rows such that visit<=2
Post baseline rows are rows such that visit>2

Вот подготовка данных в SAS, в 23 строках кода:

data base1_dset ;
 set ae_dset ;
 if visit<=2 ;

proc sort data=base1_dset ;
 by patid bodysys prefterm severity ;

data base2_dset ;
 set base1_dset ;
 by patid bodysys prefterm severity ;
 if last.prefterm ;

data post1_dset ;
 set ae_dset ;
 if visit> 2 ;

proc sort data=post1_dset ;
 by patid bodysys prefterm severity ;

data post2_dset ;
 set post1_dset ;
 by patid bodysys prefterm severity ;
 if last.prefterm ;
 rename severity = severity2 ;

data new_ae_dset ;
 merge base2_dset post2_dset ;
 by patid bodysys prefterm ;
 if severity2>severity or severity==. ;

А вот подготовка данных в Vilno Data Transformation, в 12 строках кода: (подробнее см. http://fivetimesfaster.blogspot.com)

inlist ae_dset ;
if not ( visit<=2 ) deleterow ;
select severity=max(severity) by patid bodysys prefterm ;
sendoff(base2_dset) patid bodysys prefterm severity ;

inlist ae_dset ;
if not ( visit>2 ) deleterow ;
select severity2=max(severity) by patid bodysys prefterm ;
sendoff(post2_dset) patid bodysys prefterm severity2 ;

inlist base2_dset post2_dset ;
mergeby patid bodysys prefterm ;
if not ( severity2>severity or severity is null ) deleterow ;
sendoff(new_ae_dset) patid bodysys prefterm severity2 ;

Как бы вы сделали это в R?

спасибо, Роберт

PS форматирование примеров кода ужасно, почему stackoverflow игнорирует некоторые из моих символов возврата / перевода строки?

1 Ответ

1 голос
/ 29 мая 2011

Это, кажется, делает более или менее то, что вы просите (по крайней мере, если переменные являются числовыми).Будут лучшие способы

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
...