# Peter Dalgaar Introductory Statistics
# Capitulo 10
# Manipulacion avanzada de la data Trabajando con Fechas
# Traduccion y adaptacion por Luis A. George
library(ISwR)
stroke <- read.csv2(
  system.file("rawdata","stroke.csv",
                    package="ISwR"),na.strings=".")
names(stroke) <- tolower(names(stroke))
head(stroke)
##   sex       died       dstr age dgn coma diab minf han
## 1   1  7.01.1991  2.01.1991  76 INF    0    0    1   0
## 2   1       <NA>  3.01.1991  58 INF    0    0    0   0
## 3   1  2.06.1991  8.01.1991  74 INF    0    0    1   1
## 4   0 13.01.1991 11.01.1991  77 ICH    0    1    0   1
## 5   0 23.01.1996 13.01.1991  76 INF    0    1    0   1
## 6   1 13.01.1991 13.01.1991  48 ICH    1    0    0   1
str(stroke)
## 'data.frame':    829 obs. of  9 variables:
##  $ sex : int  1 1 1 0 0 1 0 1 0 0 ...
##  $ died: Factor w/ 414 levels "1.01.1993","1.02.1992",..: 373 NA 162 60 213 60 16 57 NA 27 ...
##  $ dstr: Factor w/ 575 levels "1.01.1992","1.01.1993",..: 229 414 542 45 84 84 105 105 124 124 ...
##  $ age : int  76 58 74 77 76 48 81 53 73 69 ...
##  $ dgn : Factor w/ 4 levels "ICH","ID","INF",..: 3 3 3 1 3 1 3 3 2 3 ...
##  $ coma: int  0 0 0 0 0 1 0 0 0 0 ...
##  $ diab: int  0 0 0 1 1 0 0 0 0 0 ...
##  $ minf: int  1 0 1 0 0 0 0 1 0 0 ...
##  $ han : int  0 0 1 1 1 1 1 1 1 1 ...
stroke <- transform(stroke,
                    died=as.Date(died,format="%d.%m.%Y"),
                    dstr=as.Date(dstr,format="%d.%m.%Y"))
head(stroke)
##   sex       died       dstr age dgn coma diab minf han
## 1   1 1991-01-07 1991-01-02  76 INF    0    0    1   0
## 2   1       <NA> 1991-01-03  58 INF    0    0    0   0
## 3   1 1991-06-02 1991-01-08  74 INF    0    0    1   1
## 4   0 1991-01-13 1991-01-11  77 ICH    0    1    0   1
## 5   0 1996-01-23 1991-01-13  76 INF    0    1    0   1
## 6   1 1991-01-13 1991-01-13  48 ICH    1    0    0   1
str(stroke)
## 'data.frame':    829 obs. of  9 variables:
##  $ sex : int  1 1 1 0 0 1 0 1 0 0 ...
##  $ died: Date, format: "1991-01-07" NA ...
##  $ dstr: Date, format: "1991-01-02" "1991-01-03" ...
##  $ age : int  76 58 74 77 76 48 81 53 73 69 ...
##  $ dgn : Factor w/ 4 levels "ICH","ID","INF",..: 3 3 3 1 3 1 3 3 2 3 ...
##  $ coma: int  0 0 0 0 0 1 0 0 0 0 ...
##  $ diab: int  0 0 0 1 1 0 0 0 0 0 ...
##  $ minf: int  1 0 1 0 0 0 0 1 0 0 ...
##  $ han : int  0 0 1 1 1 1 1 1 1 1 ...
summary(stroke$died)
##         Min.      1st Qu.       Median         Mean      3rd Qu. 
## "1991-01-07" "1992-03-14" "1993-01-23" "1993-02-15" "1993-11-04" 
##         Max.         NA's 
## "1996-02-22"        "338"
summary(stroke$dstr)
##         Min.      1st Qu.       Median         Mean      3rd Qu. 
## "1991-01-02" "1991-11-08" "1992-08-12" "1992-07-27" "1993-04-30" 
##         Max. 
## "1993-12-31"
# En la data , NA para fecha de muerte (death)significa
# que el paciente no murio antes del
# del final del studio January 1, 1996
# transformaremos la data de tal manera que 
# todos los pacientes tengan una fecha final
# ademas de un indicador sobre que paso en 
# la fecha final: murieron o sobrevivieron.
stroke <- transform(stroke,
                    end=pmin(died,as.Date("1996-1-1"),
                             na.rm = TRUE),
                    dead=!is.na(died) & died<as.Date("1996-1-1"))
# La funcion pmin calcula el minimo, pero al contrario de la funcion min,
# la cual devuelve un solo valor valor numerico, ella lo hace en
# paralelo a traves de multiples vectores
# el argumento na.rm permite que los valores NA 
# sean ignorados,de tal forma que el resultado
# es que cuando died es NA o despues 1996-01-01,
# la fecha final se convierte en 1996-01-01 
# o de lo contrario en la fecha de muerte verdadera
head(stroke)
##   sex       died       dstr age dgn coma diab minf han        end  dead
## 1   1 1991-01-07 1991-01-02  76 INF    0    0    1   0 1991-01-07  TRUE
## 2   1       <NA> 1991-01-03  58 INF    0    0    0   0 1996-01-01 FALSE
## 3   1 1991-06-02 1991-01-08  74 INF    0    0    1   1 1991-06-02  TRUE
## 4   0 1991-01-13 1991-01-11  77 ICH    0    1    0   1 1991-01-13  TRUE
## 5   0 1996-01-23 1991-01-13  76 INF    0    1    0   1 1996-01-01 FALSE
## 6   1 1991-01-13 1991-01-13  48 ICH    1    0    0   1 1991-01-13  TRUE
tail(stroke)
##     sex       died       dstr age dgn coma diab minf han        end  dead
## 824   0       <NA> 1993-12-23  62 INF    0    0    0   1 1996-01-01 FALSE
## 825   0       <NA> 1993-12-26  55 INF    0    1    1   1 1996-01-01 FALSE
## 826   0 1994-06-20 1993-12-29  93 INF    0    0    0   0 1994-06-20  TRUE
## 827   0 1994-01-27 1993-12-31  81 INF    1    0    0   0 1994-01-27  TRUE
## 828   0       <NA> 1993-12-31  68 INF    0    0    0   1 1996-01-01 FALSE
## 829   0 1994-01-13 1993-12-31  74 INF    0    0    0   1 1994-01-13  TRUE
# Finalmente, para obtener el tiempo de observacion 
# para todos los individuos, podemos:
stroke <- transform(stroke,
                    obstime= as.numeric(end-dstr,units="days")/365.25)
head(stroke)
##   sex       died       dstr age dgn coma diab minf han        end  dead
## 1   1 1991-01-07 1991-01-02  76 INF    0    0    1   0 1991-01-07  TRUE
## 2   1       <NA> 1991-01-03  58 INF    0    0    0   0 1996-01-01 FALSE
## 3   1 1991-06-02 1991-01-08  74 INF    0    0    1   1 1991-06-02  TRUE
## 4   0 1991-01-13 1991-01-11  77 ICH    0    1    0   1 1991-01-13  TRUE
## 5   0 1996-01-23 1991-01-13  76 INF    0    1    0   1 1996-01-01 FALSE
## 6   1 1991-01-13 1991-01-13  48 ICH    1    0    0   1 1991-01-13  TRUE
##       obstime
## 1 0.013689254
## 2 4.993839836
## 3 0.396988364
## 4 0.005475702
## 5 4.966461328
## 6 0.000000000