Genere una muestra de tamaño 120 de la distribucion normal con media 5, desviacion estandar 0.85. Use solo dos numeros decimales (rnorm())
set.seed(2075)
Biomasa_gramos = c(round(rnorm(120,5,0.85),2))
head(Biomasa_gramos)
## [1] 3.99 5.78 4.04 4.10 6.02 4.67
Genere una muestra de tamaño 120 de la distribucion binomi con 0.8 (probabilidad), 20 (ensayos independientes) . Use solo dos numeros decimales (rbinom())
set.seed(2075)
Flores.r=c(round(rbinom(120,size = 20,prob = 0.8),2))
head(Flores.r)
## [1] 18 12 14 18 18 14
Genere una muestra de tamaño 120 de la distribucion Poisson con paŕametro 10.5(media) (rpois()
set.seed(2075)
Flores.d=c(round(rpois(120,n = 10.5),2))
head(Flores.d)
## [1] 106 104 108 121 116 123
Genere una muestra con reemplazo de tamano 120 de una secuencia de 300 numeros (sample.int())
set.seed(2075)
Hojas.d =sample.int(n=300,size = 120,replace = T)
head(Hojas.d )
## [1] 26 44 216 73 166 203
Usando la librerıa purrr genere una muestra de la distribucíon de Bernoulli detamaño 120 y parametro 0.75 (probabilidad) (rbernoulli()) y cambie el FALSE (ausente) y el TRUE por (presente).
library(purrr)
set.seed(2075)
a = rbernoulli(n = 120,p = 0.75)
Plaga= ifelse(a== TRUE, "presente","ausente")
head(Plaga,10)
## [1] "ausente" "presente" "presente" "ausente" "ausente" "presente"
## [7] "ausente" "ausente" "presente" "presente"
Genere tres niveles de un factor, cada uno con 40 datos y etiquetelos con (S) para identificar la planta (sana), (PA) para las plantas parcialmente afectadas y (MA) para las muy afectadas. Use la funci ́on (gl()).
Estatus= gl(3,40,120,labels = c("S","PA","MA"))
head(Estatus)
## [1] S S S S S S
## Levels: S PA MA
Genere dos niveles de un factor usando la distribuci ́on uniforme con paŕametros 0 y 1.2, ponga para cada datos a generar de los 120 la condicíon de si el ńumero generado es menor a 0.5, los etiquetamos como (FO) para asociarlo a fertilizacion organica, de lo contrario, use (FI) para asociarlo a fertilizaci ́on inorg ́anica. Use la funcion (runif()). Si lo desea use la funcion (ifelse()) o (if else()) para condicionar.
set.seed(2070)
datos=runif(120,0,1.20)
fertilizacion= ifelse(datos<0.5,"FO","FI")
dat= data.frame(datos,
fertilizacion)
head(dat)
## datos fertilizacion
## 1 0.24008254 FO
## 2 0.61643353 FI
## 3 0.30499858 FO
## 4 0.54575941 FI
## 5 0.04122079 FO
## 6 0.95228550 FI
Construya un marco de datos (data.frame()) o una tableta (tibble()) con todas la variables antes generadas y asigne repectivamente los nombres de variable: Biomasa(gramos), Flores.r (conteo de flores en tres ramas), Flores.d (conteo de flores desprendidas), Hojas.d (conteo de hojas desprendidas), Plaga , Estatus y Fertlizacion.Revise del objeto creado, su dimensi ́on (dim()), su estructura con (str()) o (glimpse()), la clase (class()), los nombres en las variables (names()), la presencia de faltantes (is.na())
total= data.frame("Biomasa(gramos)"=Biomasa_gramos,
"Flores.r"=Flores.r,
"Flores.d"=Flores.d,
"Hojas.d "=Hojas.d,
"Plaga"=Plaga,
"Estatus"=Estatus,
"fertilizacion"=fertilizacion)
head(total)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 3.99 18 106 26 ausente S FO
## 2 5.78 12 104 44 presente S FI
## 3 4.04 14 108 216 presente S FO
## 4 4.10 18 121 73 ausente S FI
## 5 6.02 18 116 166 ausente S FO
## 6 4.67 14 123 203 presente S FI
str(total)
## 'data.frame': 120 obs. of 7 variables:
## $ Biomasa.gramos.: num 3.99 5.78 4.04 4.1 6.02 4.67 4.88 5.23 4.2 5.78 ...
## $ Flores.r : num 18 12 14 18 18 14 18 18 14 16 ...
## $ Flores.d : num 106 104 108 121 116 123 109 141 121 117 ...
## $ Hojas.d. : int 26 44 216 73 166 203 33 234 143 166 ...
## $ Plaga : chr "ausente" "presente" "presente" "ausente" ...
## $ Estatus : Factor w/ 3 levels "S","PA","MA": 1 1 1 1 1 1 1 1 1 1 ...
## $ fertilizacion : chr "FO" "FI" "FO" "FI" ...
class(total)
## [1] "data.frame"
colnames(total)
## [1] "Biomasa.gramos." "Flores.r" "Flores.d" "Hojas.d."
## [5] "Plaga" "Estatus" "fertilizacion"
table(is.na(total))
##
## FALSE
## 840
Usando la informacion del punto anterior, Seleccione un subconjunto (el 75 % de las filas de todas las columnas) de todo el marco de datos o tableta. Use la funcion (samplen()) y asigne un valor faltante NA a dos variables cuantitativas cualesquiera del conjunto de datos muestreado. LLame tib.c al data.frame completo y tic.i al pequeno. Con estos dos data.frames resuelva los puntos que se presentas en los ejercicios posteriores.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
set.seed(2075)
tib.c= total
tib.i = sample_n(total,size = round(length(total$Plaga)*0.75),replace = T)
tib.i$Hojas.d.= ifelse(tib.i$Hojas.d.< 20,NA,
tib.i$Hojas.d.)
tib.i$Biomasa.gramos.= ifelse(tib.i$Biomasa.gramos.< 4,NA,
tib.i$Biomasa.gramos.)
table(is.na(tib.c))
##
## FALSE
## 840
head(tib.c)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 3.99 18 106 26 ausente S FO
## 2 5.78 12 104 44 presente S FI
## 3 4.04 14 108 216 presente S FO
## 4 4.10 18 121 73 ausente S FI
## 5 6.02 18 116 166 ausente S FO
## 6 4.67 14 123 203 presente S FI
table(is.na(tib.i))
##
## FALSE TRUE
## 615 15
head(tib.i)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 4.81 17 116 178 ausente MA FI
## 2 4.63 15 123 115 presente S FI
## 3 5.30 20 117 47 ausente PA FO
## 4 NA 17 121 287 ausente PA FI
## 5 6.19 18 104 252 ausente MA FI
## 6 4.07 14 141 219 presente MA FI
library(dplyr)
tib.ip = dplyr::select(tib.i,Plaga)
head(tib.ip)
## Plaga
## 1 ausente
## 2 presente
## 3 ausente
## 4 ausente
## 5 ausente
## 6 presente
tib.i36 = dplyr::select(tib.i,c(3:6))
head(tib.i36)
## Flores.d Hojas.d. Plaga Estatus
## 1 116 178 ausente MA
## 2 123 115 presente S
## 3 117 47 ausente PA
## 4 121 287 ausente PA
## 5 104 252 ausente MA
## 6 141 219 presente MA
No seleccione desde la tercera a la sexta variable con (select(!(:))) para tib.c
tib.i_36 = dplyr::select(tib.i,c(3:6))
head(tib.i_36)
## Flores.d Hojas.d. Plaga Estatus
## 1 116 178 ausente MA
## 2 123 115 presente S
## 3 117 47 ausente PA
## 4 121 287 ausente PA
## 5 104 252 ausente MA
## 6 141 219 presente MA
Seleccione las que no finalizan con .d usando (select(!ends with()))
tib.iend = dplyr::select(tib.i,!ends_with(".d"))
head(tib.iend)
## Biomasa.gramos. Flores.r Hojas.d. Plaga Estatus fertilizacion
## 1 4.81 17 178 ausente MA FI
## 2 4.63 15 115 presente S FI
## 3 5.30 20 47 ausente PA FO
## 4 NA 17 287 ausente PA FI
## 5 6.19 18 252 ausente MA FI
## 6 4.07 14 219 presente MA FI
Seleccione las que comienzan con Fl usando (select(starts with()))
tib.istar = dplyr::select(tib.i,starts_with("Fl"))
head(tib.istar)
## Flores.r Flores.d
## 1 17 116
## 2 15 123
## 3 20 117
## 4 17 121
## 5 18 104
## 6 14 141
tib.istarr = dplyr::select(tib.i,starts_with("Fl")&ends_with(".d"))
head(tib.istarr)
## Flores.d
## 1 116
## 2 123
## 3 117
## 4 121
## 5 104
## 6 141
Seleccione una variable cualquiera con (select()) para tib:c y agrupela por Estatus usando ( group by() )
var_estatus = dplyr::select(tib.i,c(Biomasa.gramos.,Estatus)) %>%
group_by(Estatus)
head(var_estatus)
## # A tibble: 6 × 2
## # Groups: Estatus [3]
## Biomasa.gramos. Estatus
## <dbl> <fct>
## 1 4.81 MA
## 2 4.63 S
## 3 5.3 PA
## 4 NA PA
## 5 6.19 MA
## 6 4.07 MA
Guarde el resultado previo en la variable var estatus y ordene de mayor a menor por la misma variable anterior usando (arrange(desc(), .by group = T RUE)) para tib.c
var_estatus %>%
arrange(desc(Biomasa.gramos.),.by_group = T)
## # A tibble: 90 × 2
## # Groups: Estatus [3]
## Biomasa.gramos. Estatus
## <dbl> <fct>
## 1 7.27 S
## 2 7.27 S
## 3 7.03 S
## 4 6.67 S
## 5 6.13 S
## 6 6.13 S
## 7 6.02 S
## 8 6.02 S
## 9 6.02 S
## 10 5.8 S
## # … with 80 more rows
Filtre los datos que comienzan con Flores para el estatus muy afectadas (Filter(,) )
tib.if = filter(tib.i,Estatus== "MA") %>%
select(c(2,3,6))
head(tib.if)
## Flores.r Flores.d Estatus
## 1 17 116 MA
## 2 18 104 MA
## 3 14 141 MA
## 4 16 108 MA
## 5 16 109 MA
## 6 18 116 MA
tib.ib = filter(tib.i,Biomasa.gramos.>5)
head(tib.ib)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 5.30 20 117 47 ausente PA FO
## 2 6.19 18 104 252 ausente MA FI
## 3 5.73 14 108 108 presente PA FI
## 4 6.02 16 141 267 presente S FI
## 5 5.09 16 109 56 presente MA FI
## 6 5.33 18 123 151 ausente MA FO
tib.if= filter(tib.i,fertilizacion=="FO",Estatus=="PA")
head(tib.if)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 5.30 20 117 47 ausente PA FO
## 2 4.95 15 121 113 presente PA FO
## 3 6.05 16 141 255 presente PA FO
## 4 4.42 13 123 225 presente PA FO
## 5 5.30 20 117 47 ausente PA FO
## 6 4.04 16 106 105 presente PA FO
tib.ifo= filter(tib.i,fertilizacion=="FO"|Estatus=="PA")
tib.ifo[c(10:20),]
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 10 NA 14 116 271 presente PA FI
## 11 5.33 18 123 151 ausente MA FO
## 12 4.60 11 108 211 presente S FO
## 13 5.92 15 117 281 presente PA FI
## 14 4.95 15 121 113 presente PA FO
## 15 5.23 18 141 234 ausente S FO
## 16 6.05 16 141 255 presente PA FO
## 17 NA 17 121 287 ausente PA FI
## 18 4.42 13 123 225 presente PA FO
## 19 4.69 15 117 81 presente MA FO
## 20 NA 17 121 287 ausente PA FI
tib.im= filter(tib.i,Flores.d>median(Flores.d)& Plaga=="presente")
tib.im2= filter(tib.i,Flores.d>median(Flores.d)& Plaga=="ausente")
head(tib.im)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 4.63 15 123 115 presente S FI
## 2 4.07 14 141 219 presente MA FI
## 3 6.02 16 141 267 presente S FI
## 4 4.22 16 141 159 presente S FI
## 5 5.30 15 141 171 presente MA FI
## 6 6.02 16 141 267 presente S FI
head(tib.im2)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 5.30 20 117 47 ausente PA FO
## 2 NA 17 121 287 ausente PA FI
## 3 NA 18 121 100 ausente PA FI
## 4 5.33 18 123 151 ausente MA FO
## 5 5.33 18 123 151 ausente MA FO
## 6 5.23 18 141 234 ausente S FO
tib.ihd= filter(tib.i,Hojas.d.>median(Hojas.d., na.rm
= TRUE)& Plaga=="presente")
head(tib.ihd)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 4.07 14 141 219 presente MA FI
## 2 6.02 16 141 267 presente S FI
## 3 NA 14 116 271 presente PA FI
## 4 NA 16 108 181 presente MA FO
## 5 4.98 16 108 221 presente S FI
## 6 5.30 15 141 171 presente MA FI
tib.chd= filter(tib.c,Hojas.d.>median(Hojas.d., na.rm
= TRUE)& Plaga=="presente")
head(tib.chd)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 4.04 14 108 216 presente S FO
## 2 4.67 14 123 203 presente S FI
## 3 5.78 16 117 166 presente S FO
## 4 5.36 16 108 229 presente S FO
## 5 7.27 17 123 264 presente S FO
## 6 4.60 11 108 211 presente S FO
quantile(tib.c$Flores.r)
## 0% 25% 50% 75% 100%
## 11 15 16 17 20
quantile(tib.c$Biomasa.gramos.)
## 0% 25% 50% 75% 100%
## 2.07 4.37 4.95 5.58 7.27
v1 =c("Flores.r","Biomasa.gramos.")
v2= c(15,5.58)
tib.c %>%
filter( .data[[v1[[1]]]] > v2[[1]],
.data[[v1[[2]]]] > v2[[2]])
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 6.02 18 116 166 ausente S FO
## 2 5.78 16 117 166 presente S FO
## 3 6.13 17 106 75 presente S FI
## 4 7.03 17 104 23 presente S FI
## 5 5.80 16 121 115 presente S FI
## 6 7.27 17 123 264 presente S FO
## 7 6.67 18 117 284 ausente S FO
## 8 6.02 16 141 267 presente S FI
## 9 6.12 17 106 199 ausente PA FO
## 10 5.70 16 123 238 presente PA FI
## 11 6.05 16 141 255 presente PA FO
## 12 5.63 17 108 16 presente PA FO
## 13 6.19 18 104 252 ausente MA FI
## 14 6.01 16 123 196 presente MA FI
## 15 6.98 17 117 131 presente MA FO
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
##
## discard
library(dplyr)
tibi.e = mutate(tib.c , "bio.masa.z"= scale(tib.c$Biomasa.gramos.))
tibi.e2 <- mutate_all(tibi.e[,2:4],
funs("estandar" = rescale( . )))
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## Please use a list of either functions or lambdas:
##
## # Simple named list:
## list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`:
## tibble::lst(mean, median)
##
## # Using lambdas
## list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
tibi.e= mutate(tibi.e,tibi.e2)
head(tibi.e[8:11])
## bio.masa.z Flores.r_estandar Flores.d_estandar Hojas.d._estandar
## 1 -1.1193683 0.7777778 0.05405405 0.08304498
## 2 0.9436117 0.1111111 0.00000000 0.14532872
## 3 -1.0617432 0.3333333 0.10810811 0.74048443
## 4 -0.9925930 0.7777778 0.45945946 0.24567474
## 5 1.2202123 0.7777778 0.32432432 0.56747405
## 6 -0.3356664 0.3333333 0.51351351 0.69550173
tibi.e = mutate(tibi.e , "flores divi"= Flores.r/Flores.d)
head(tibi.e[12])
## flores divi
## 1 0.1698113
## 2 0.1153846
## 3 0.1296296
## 4 0.1487603
## 5 0.1551724
## 6 0.1138211
tibi.eg <- tibi.e %>%
group_by(Plaga) %>%
select("flores divi") %>%
filter_at(vars("flores divi"),
all_vars(. == min(.))) #variables al maximo
## Adding missing grouping variables: `Plaga`
tibi.eg
## # A tibble: 3 × 2
## # Groups: Plaga [2]
## Plaga `flores divi`
## <chr> <dbl>
## 1 ausente 0.128
## 2 ausente 0.128
## 3 presente 0.0922
tibi.er <- rename(tibi.e, "d.Flores"= Flores.d ,
"r.Flores"=Flores.r )
names(tibi.er)
## [1] "Biomasa.gramos." "r.Flores" "d.Flores"
## [4] "Hojas.d." "Plaga" "Estatus"
## [7] "fertilizacion" "bio.masa.z" "Flores.r_estandar"
## [10] "Flores.d_estandar" "Hojas.d._estandar" "flores divi"
tibi.eM <- select_all(tibi.e , toupper)
names(tibi.eM )
## [1] "BIOMASA.GRAMOS." "FLORES.R" "FLORES.D"
## [4] "HOJAS.D." "PLAGA" "ESTATUS"
## [7] "FERTILIZACION" "BIO.MASA.Z" "FLORES.R_ESTANDAR"
## [10] "FLORES.D_ESTANDAR" "HOJAS.D._ESTANDAR" "FLORES DIVI"
tibi.s= tib.i%>%
filter(!is.na(Biomasa.gramos.)) %>%
summarise_at(vars(Biomasa.gramos.),
funs(mean,length))
tibi.s
## mean length
## 1 5.276494 77
tibi.sf= tib.i%>%
group_by(fertilizacion) %>%
filter(!is.na(Biomasa.gramos.)) %>%
summarise_at(vars(Biomasa.gramos.),
funs(mean,length))
tibi.sf
## # A tibble: 2 × 3
## fertilizacion mean length
## <chr> <dbl> <int>
## 1 FI 5.24 55
## 2 FO 5.36 22
tibi.sq= tib.i%>%
group_by(fertilizacion) %>%
filter(!is.na(Biomasa.gramos.)) %>%
summarise_at(vars(Biomasa.gramos.),
funs(quantile(Biomasa.gramos.,probs=c(10, 20, 30, 40,50)/100)))
tibi.sq
## # A tibble: 10 × 2
## # Groups: fertilizacion [2]
## fertilizacion Biomasa.gramos.
## <chr> <dbl>
## 1 FI 4.25
## 2 FI 4.56
## 3 FI 4.81
## 4 FI 4.97
## 5 FI 5.17
## 6 FO 4.56
## 7 FO 4.62
## 8 FO 4.77
## 9 FO 5.12
## 10 FO 5.22
tibi.ss= tib.i%>%
group_by(fertilizacion,Plaga) %>%
filter(!is.na(Biomasa.gramos.)) %>%
summarise_at(vars(Biomasa.gramos.),
funs(length,mean,sd,max,min,median,
"media truncada"=mean(Biomasa.gramos., trim = 0.1),
var))
tibi.ss
## # A tibble: 4 × 10
## # Groups: fertilizacion [2]
## fertilizacion Plaga length mean sd max min median `media truncada`
## <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 FI ausente 10 5.28 0.549 6.19 4.67 5.30 5.24
## 2 FI presente 45 5.23 0.757 7.03 4.07 5.15 5.20
## 3 FO ausente 10 5.25 0.579 6.67 4.56 5.26 5.16
## 4 FO presente 12 5.45 1.15 7.27 4.04 5.08 5.41
## # … with 1 more variable: var <dbl>
tibi.ssd= tib.i%>%
filter(Estatus == "S") %>%
group_by(fertilizacion,Plaga) %>%
filter(!is.na(Biomasa.gramos.)) %>%
summarise_at(vars(Biomasa.gramos.),
funs(length,mean,sd,max,min,median,
"media truncada"=mean(Biomasa.gramos., trim = 0.1),
var))
tibi.ssd
## # A tibble: 4 × 10
## # Groups: fertilizacion [2]
## fertilizacion Plaga length mean sd max min median `media truncada`
## <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 FI ausente 1 5.25 NA 5.25 5.25 5.25 5.25
## 2 FI presente 22 5.25 0.823 7.03 4.22 5.31 5.22
## 3 FO ausente 2 5.95 1.02 6.67 5.23 5.95 5.95
## 4 FO presente 3 6.38 1.54 7.27 4.6 7.27 6.38
## # … with 1 more variable: var <dbl>
Con la tableta con faltantes use la funci ́on dropna() para sacar los faltantes y compare las estad ́ısticas obtenidas en el item anterior con y sin faltantes
tibi.ssd2= tib.i%>%
filter(Estatus == "S") %>%
group_by(fertilizacion,Plaga) %>%
summarise_at(vars(Biomasa.gramos.),
funs(length,mean,sd,max,min,median,
"media truncada"=mean(Biomasa.gramos., trim = 0.1),
var))
tibi.ssd2
## # A tibble: 4 × 10
## # Groups: fertilizacion [2]
## fertilizacion Plaga length mean sd max min median `media truncada`
## <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 FI ausente 1 5.25 NA 5.25 5.25 5.25 5.25
## 2 FI presente 22 5.25 0.823 7.03 4.22 5.31 5.22
## 3 FO ausente 2 5.95 1.02 6.67 5.23 5.95 5.95
## 4 FO presente 6 NA NA NA NA NA NA
## # … with 1 more variable: var <dbl>
tibi.in <- filter(tib.i,
Estatus %in% c("PA", "MA"))
head(tibi.in)
## Biomasa.gramos. Flores.r Flores.d Hojas.d. Plaga Estatus fertilizacion
## 1 4.81 17 116 178 ausente MA FI
## 2 5.30 20 117 47 ausente PA FO
## 3 NA 17 121 287 ausente PA FI
## 4 6.19 18 104 252 ausente MA FI
## 5 4.07 14 141 219 presente MA FI
## 6 NA 18 121 100 ausente PA FI
table(tibi.in$Estatus)
##
## S PA MA
## 0 29 30
tib.icases =tib.i %>%
filter(complete.cases(tib.i))
table(is.na(tib.icases))
##
## FALSE
## 525
names(tib.c)
## [1] "Biomasa.gramos." "Flores.r" "Flores.d" "Hojas.d."
## [5] "Plaga" "Estatus" "fertilizacion"
tib.f = tib.c %>%
select(!starts_with("Flores"))
names(tib.f)
## [1] "Biomasa.gramos." "Hojas.d." "Plaga" "Estatus"
## [5] "fertilizacion"
primero los conteos de flores
tib.nf= tib.c %>%
select(contains("d")) %>%
select(everything(vars = c("flores","hojas") ))
head(tib.nf)
## Flores.d Hojas.d.
## 1 106 26
## 2 104 44
## 3 108 216
## 4 121 73
## 5 116 166
## 6 123 203