Paquetes

library(tidyverse)
library(stringr)

Dataset

df <- read_csv("queilits.csv")
Parsed with column specification:
cols(
  .default = col_character(),
  Fototipo = col_integer()
)
See spec(...) for full column specifications.

Primero cambio los si-no a presente/ausente

df <- df %>%  # creo un nuevo df sobre el df original
  select(`Sequedad Labial`:`Presencia de Queilitis Actinica`, `Nombre de Pcte.`, `Edad Pcte.`, `Sexo Pcte.` ) %>%  # selecciono solo las columnas que voy a utilizar
  gather(`Sequedad Labial`:`Atrofia de labio`, 
         key = "Signo", value = "Presencia o ausencia") # ahora reuno las columnas de Sequedad a Atrofia, las junto en una columa (key=) y los valores los agrego a value. Ahora me quedan 3 columnas
glimpse(df)
Observations: 1,356
Variables: 6
$ Presencia de Queilitis Actinica <chr> "Presente", "Presente", "Ausente", "Presente", "Ausente", "Presente", "Presente", "Au...
$ Nombre de Pcte.                 <chr> "Paillalef Millahual Mario Esteban", "Guala Carrasco Pedro", "Saldivia Barria Ana", "...
$ Edad Pcte.                      <chr> "35", "59", "66", "52 años", "26", "67 años", "62", "72", "63", "55 años", "50", "53"...
$ Sexo Pcte.                      <chr> "Masculino", "Masculino", "Femenino", "Masculino", "Masculino", "Masculino", "Masculi...
$ Signo                           <chr> "Sequedad Labial", "Sequedad Labial", "Sequedad Labial", "Sequedad Labial", "Sequedad...
$ Presencia o ausencia            <chr> "Presente", "Presente", "Ausente", "Presente", "Presente", "Presente", "Presente", "A...

Voy a hacer una tabla para ver

table(df$Signo, df$`Presencia o ausencia`)
                                          
                                           ausente Ausente  No  NO presente Presente  Si  SI
  Ardor o Prurito                                0     107   0   0        0        6   0   0
  Atrofia de labio                               0       0 102   0        0        0   0  11
  Edema                                          0      98   0   0        0       15   0   0
  Eritema                                       28       0   0   0       85        0   0   0
  Esfumación del Borde Bermellón del labio       0       0  60   0        0        0  53   0
  Línea Muco-Cutánea                             0      31   0   0        0       69   0   0
  Pliegues labiales marcados                     0       0   0  57        0        0  56   0
  Presencia de Costra                            0     104   0   0        0        9   0   0
  Presencia de lesión Escamosa                   0     105   0   0        0        8   0   0
  Presencia de Mancha o Placa Blanca             0       0   0  74        0        0  39   0
  Sequedad Labial                                0      21   0   0        0       92   0   0
  Ulceración/fisuración del Labio                0      85   0   0       28        0   0   0

OK, todo siempre puede ser peor. No solo hay “ausente” y “presente”, sino que también “Ausente”, “Presente” y por supuesto los “si” y “no”

Paso todo a minúsculas

df$`Presencia o ausencia` <- str_to_lower(df$`Presencia o ausencia`)

Ahora quedan cuatro categorías. Paso todas las no a ausente y si a presente

df$`Presencia o ausencia` <- str_replace(df$`Presencia o ausencia`, 
                                         "no", 
                                         "ausente")
df$`Presencia o ausencia` <- str_replace(df$`Presencia o ausencia`, 
                                         "si", 
                                         "presente")
# cambio la edad, le saco "años"
df$`Edad Pcte.` <- str_replace(df$`Edad Pcte.`, 
                               " años", 
                               "") # que locura el ingreso de datos...
df$`Edad Pcte.` <- as.numeric(df$`Edad Pcte.`) #cambio de chr a num

Cambio los presente o ausente de queilitis a con queilits y sin queilitis para no confundirme

df$`Presencia de Queilitis Actinica` <- str_replace(df$`Presencia de Queilitis Actinica`, 
                                                    "Presente", 
                                                    "con queilitis")
df$`Presencia de Queilitis Actinica` <- str_replace(df$`Presencia de Queilitis Actinica`, 
                                                    "Ausente", 
                                                    "sin queilitis")
glimpse(df)
Observations: 1,356
Variables: 6
$ Presencia de Queilitis Actinica <chr> "con queilitis", "con queilitis", "sin queilitis", "con queilitis", "sin queilitis", ...
$ Nombre de Pcte.                 <chr> "Paillalef Millahual Mario Esteban", "Guala Carrasco Pedro", "Saldivia Barria Ana", "...
$ Edad Pcte.                      <dbl> 35, 59, 66, 52, 26, 67, 62, 72, 63, 55, 50, 53, 45, 45, 56, 68, 38, 52, 54, 24, 36, 3...
$ Sexo Pcte.                      <chr> "Masculino", "Masculino", "Femenino", "Masculino", "Masculino", "Masculino", "Masculi...
$ Signo                           <chr> "Sequedad Labial", "Sequedad Labial", "Sequedad Labial", "Sequedad Labial", "Sequedad...
$ Presencia o ausencia            <chr> "presente", "presente", "ausente", "presente", "presente", "presente", "presente", "a...

Vamos a ver ahora

table(df$Signo, df$`Presencia o ausencia`)

Ahora si…

Otro estilo de tabla:

Vamos a ver si se puede graficar

df %>%  # tomo el df
  filter(`Presencia o ausencia` == "presente") %>% #filtro  
  ggplot(aes(x = Signo)) + # grafico, el eje x es signo
  geom_bar() # en forma de barras

Bien, pero sale todo junto, cambio los ejes

df %>% 
  filter(`Presencia o ausencia` == "presente") %>% 
  ggplot(aes(x = Signo)) +
  geom_bar() +
  coord_flip() # con esto roto los ejes

todo muy bien, pero son variables nominales, perfectamente las puedo ordenar de mayor a menor sin perder información

Necesito 1. hacer una tabla 2. ordernarla, y 3 graficarla

df %>% 
  filter(`Presencia o ausencia` == "presente") %>% 
  ggplot(aes(x = Signo)) +
  geom_bar() +
  coord_flip()

Tareas:

Ordenar por recuento de categoria Hacer facet por si tiene o no quelitis hacer análisis Mantel-Haenzel

table(df$Signo, df$`Presencia o ausencia`, df$`Presencia de Queilitis Actinica`)
, ,  = con queilitis

                                          
                                           ausente presente
  Ardor o Prurito                               33        4
  Atrofia de labio                              26       11
  Edema                                         25       12
  Eritema                                        2       35
  Esfumación del Borde Bermellón del labio       5       32
  Línea Muco-Cutánea                            28        2
  Pliegues labiales marcados                     6       31
  Presencia de Costra                           30        7
  Presencia de lesión Escamosa                  30        7
  Presencia de Mancha o Placa Blanca            11       26
  Sequedad Labial                                3       34
  Ulceración/fisuración del Labio               18       19

, ,  = sin queilitis

                                          
                                           ausente presente
  Ardor o Prurito                               74        2
  Atrofia de labio                              76        0
  Edema                                         73        3
  Eritema                                       26       50
  Esfumación del Borde Bermellón del labio      55       21
  Línea Muco-Cutánea                             3       67
  Pliegues labiales marcados                    51       25
  Presencia de Costra                           74        2
  Presencia de lesión Escamosa                  75        1
  Presencia de Mancha o Placa Blanca            63       13
  Sequedad Labial                               18       58
  Ulceración/fisuración del Labio               67        9
paraMantelHaenzel <-  table(df$Signo, df$`Presencia o ausencia`, df$`Presencia de Queilitis Actinica`)
mosaicplot(table(df$Signo, df$`Presencia o ausencia`, df$`Presencia de Queilitis Actinica`), 
           shade = T)

mantelhaen.test(x = df$Signo, 
                y = df$`Presencia o ausencia`,
                z = df$`Presencia de Queilitis Actinica`, 
                alternative = c("two.sided"), 
                correct = T, 
                exact = F, 
                conf.level = 0.95)

    Cochran-Mantel-Haenszel test

data:  df$Signo and df$`Presencia o ausencia` and df$`Presencia de Queilitis Actinica`
Cochran-Mantel-Haenszel M^2 = 458.48, df = 11, p-value < 2.2e-16
LS0tDQp0aXRsZTogIlF1ZWlsaXRpcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgUGFxdWV0ZXMNCmBgYHtyICBwYXF1ZXRlc30NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdHJpbmdyKQ0KYGBgDQoNCiMgRGF0YXNldA0KYGBge3IgZGF0YWZyYW1lfQ0KZGYgPC0gcmVhZF9jc3YoInF1ZWlsaXRzLmNzdiIpDQpgYGANCg0KUHJpbWVybyBjYW1iaW8gbG9zIHNpLW5vIGEgcHJlc2VudGUvYXVzZW50ZQ0KDQoNCmBgYHtyIHNlbGVjdCB5IGdhdGhlcn0NCmRmIDwtIGRmICU+JSAgIyBjcmVvIHVuIG51ZXZvIGRmIHNvYnJlIGVsIGRmIG9yaWdpbmFsDQogIHNlbGVjdChgU2VxdWVkYWQgTGFiaWFsYDpgUHJlc2VuY2lhIGRlIFF1ZWlsaXRpcyBBY3RpbmljYWAsIGBOb21icmUgZGUgUGN0ZS5gLCBgRWRhZCBQY3RlLmAsIGBTZXhvIFBjdGUuYCApICU+JSAgIyBzZWxlY2Npb25vIHNvbG8gbGFzIGNvbHVtbmFzIHF1ZSB2b3kgYSB1dGlsaXphcg0KICBnYXRoZXIoYFNlcXVlZGFkIExhYmlhbGA6YEF0cm9maWEgZGUgbGFiaW9gLCANCiAgICAgICAgIGtleSA9ICJTaWdubyIsIHZhbHVlID0gIlByZXNlbmNpYSBvIGF1c2VuY2lhIikgIyBhaG9yYSByZXVubyBsYXMgY29sdW1uYXMgZGUgU2VxdWVkYWQgYSBBdHJvZmlhLCBsYXMganVudG8gZW4gdW5hIGNvbHVtYSAoa2V5PSkgeSBsb3MgdmFsb3JlcyBsb3MgYWdyZWdvIGEgdmFsdWUuIEFob3JhIG1lIHF1ZWRhbiAzIGNvbHVtbmFzDQoNCmdsaW1wc2UoZGYpDQoNCg0KYGBgDQpWb3kgYSBoYWNlciB1bmEgdGFibGEgcGFyYSB2ZXINCmBgYHtyIHRhYmxhIHBhcmEgdmVyIHF1ZSB0YWwgdmFtb3N9DQp0YWJsZShkZiRTaWdubywgZGYkYFByZXNlbmNpYSBvIGF1c2VuY2lhYCkNCmBgYA0KDQpPSywgdG9kbyBzaWVtcHJlIHB1ZWRlIHNlciBwZW9yLiBObyBzb2xvIGhheSAiYXVzZW50ZSIgeSAicHJlc2VudGUiLCBzaW5vIHF1ZSB0YW1iacOpbiAiQXVzZW50ZSIsICJQcmVzZW50ZSIgeSBwb3Igc3VwdWVzdG8gbG9zICJzaSIgeSAibm8iDQoNClBhc28gdG9kbyBhIG1pbsO6c2N1bGFzDQoNCmBgYHtyIHRvZG8gYSBtaW51c2N1bGFzfQ0KZGYkYFByZXNlbmNpYSBvIGF1c2VuY2lhYCA8LSBzdHJfdG9fbG93ZXIoZGYkYFByZXNlbmNpYSBvIGF1c2VuY2lhYCkNCmBgYA0KDQpBaG9yYSBxdWVkYW4gY3VhdHJvIGNhdGVnb3LDrWFzLiBQYXNvIHRvZGFzIGxhcyBubyBhIGF1c2VudGUgeSBzaSBhIHByZXNlbnRlDQpgYGB7ciBjYW1iaW8gc2kgeSBub30NCmRmJGBQcmVzZW5jaWEgbyBhdXNlbmNpYWAgPC0gc3RyX3JlcGxhY2UoZGYkYFByZXNlbmNpYSBvIGF1c2VuY2lhYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVzZW50ZSIpDQpkZiRgUHJlc2VuY2lhIG8gYXVzZW5jaWFgIDwtIHN0cl9yZXBsYWNlKGRmJGBQcmVzZW5jaWEgbyBhdXNlbmNpYWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2kiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZXNlbnRlIikNCg0KIyBjYW1iaW8gbGEgZWRhZCwgbGUgc2FjbyAiYcOxb3MiDQpkZiRgRWRhZCBQY3RlLmAgPC0gc3RyX3JlcGxhY2UoZGYkYEVkYWQgUGN0ZS5gLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGHDsW9zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpICMgcXVlIGxvY3VyYSBlbCBpbmdyZXNvIGRlIGRhdG9zLi4uDQpkZiRgRWRhZCBQY3RlLmAgPC0gYXMubnVtZXJpYyhkZiRgRWRhZCBQY3RlLmApICNjYW1iaW8gZGUgY2hyIGEgbnVtDQpgYGANCg0KQ2FtYmlvIGxvcyBwcmVzZW50ZSBvIGF1c2VudGUgZGUgcXVlaWxpdGlzIGEgY29uIHF1ZWlsaXRzIHkgc2luIHF1ZWlsaXRpcyBwYXJhIG5vIGNvbmZ1bmRpcm1lDQoNCmBgYHtyfQ0KZGYkYFByZXNlbmNpYSBkZSBRdWVpbGl0aXMgQWN0aW5pY2FgIDwtIHN0cl9yZXBsYWNlKGRmJGBQcmVzZW5jaWEgZGUgUXVlaWxpdGlzIEFjdGluaWNhYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXNlbnRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbiBxdWVpbGl0aXMiKQ0KDQoNCmRmJGBQcmVzZW5jaWEgZGUgUXVlaWxpdGlzIEFjdGluaWNhYCA8LSBzdHJfcmVwbGFjZShkZiRgUHJlc2VuY2lhIGRlIFF1ZWlsaXRpcyBBY3RpbmljYWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXNlbnRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbiBxdWVpbGl0aXMiKQ0KDQpnbGltcHNlKGRmKQ0KYGBgDQoNCg0KVmFtb3MgYSB2ZXIgYWhvcmENCmBgYHtyIHZlbyBjb21vIHZhbW9zLCBhaG9yYSBzaX0NCnRhYmxlKGRmJFNpZ25vLCBkZiRgUHJlc2VuY2lhIG8gYXVzZW5jaWFgKQ0KYGBgDQpBaG9yYSBzaS4uLg0KDQpPdHJvIGVzdGlsbyBkZSB0YWJsYTogDQoNClZhbW9zIGEgdmVyIHNpIHNlIHB1ZWRlIGdyYWZpY2FyDQoNCmBgYHtyIHByaW1lciBncmFmfQ0KZGYgJT4lICAjIHRvbW8gZWwgZGYNCiAgZmlsdGVyKGBQcmVzZW5jaWEgbyBhdXNlbmNpYWAgPT0gInByZXNlbnRlIikgJT4lICNmaWx0cm8gIA0KICBnZ3Bsb3QoYWVzKHggPSBTaWdubykpICsgIyBncmFmaWNvLCBlbCBlamUgeCBlcyBzaWdubw0KICBnZW9tX2JhcigpICMgZW4gZm9ybWEgZGUgYmFycmFzDQpgYGANCg0KQmllbiwgcGVybyBzYWxlIHRvZG8ganVudG8sIGNhbWJpbyBsb3MgZWplcw0KDQpgYGB7ciAyZG8gZ3JhcGh9DQpkZiAlPiUgDQogIGZpbHRlcihgUHJlc2VuY2lhIG8gYXVzZW5jaWFgID09ICJwcmVzZW50ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gU2lnbm8pKSArDQogIGdlb21fYmFyKCkgKw0KICBjb29yZF9mbGlwKCkgIyBjb24gZXN0byByb3RvIGxvcyBlamVzDQpgYGANCg0KdG9kbyBtdXkgYmllbiwgcGVybyBzb24gdmFyaWFibGVzIG5vbWluYWxlcywgcGVyZmVjdGFtZW50ZSBsYXMgcHVlZG8gb3JkZW5hciBkZSBtYXlvciBhIG1lbm9yIHNpbiBwZXJkZXIgaW5mb3JtYWNpw7NuDQoNCk5lY2VzaXRvDQoxLiBoYWNlciB1bmEgdGFibGENCjIuIG9yZGVybmFybGEsIHkNCjMgZ3JhZmljYXJsYQ0KDQoNCg0KYGBge3J9DQpkZiAlPiUgDQogIGZpbHRlcihgUHJlc2VuY2lhIG8gYXVzZW5jaWFgID09ICJwcmVzZW50ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gU2lnbm8pKSArDQogIGdlb21fYmFyKCkgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQoNClRhcmVhczogDQoNCk9yZGVuYXIgcG9yIHJlY3VlbnRvIGRlIGNhdGVnb3JpYQ0KSGFjZXIgZmFjZXQgcG9yIHNpIHRpZW5lIG8gbm8gcXVlbGl0aXMNCmhhY2VyIGFuw6FsaXNpcyBNYW50ZWwtSGFlbnplbA0KDQpgYGB7cn0NCnRhYmxlKGRmJFNpZ25vLCBkZiRgUHJlc2VuY2lhIG8gYXVzZW5jaWFgLCBkZiRgUHJlc2VuY2lhIGRlIFF1ZWlsaXRpcyBBY3RpbmljYWApDQoNCnBhcmFNYW50ZWxIYWVuemVsIDwtICB0YWJsZShkZiRTaWdubywgZGYkYFByZXNlbmNpYSBvIGF1c2VuY2lhYCwgZGYkYFByZXNlbmNpYSBkZSBRdWVpbGl0aXMgQWN0aW5pY2FgKQ0KYGBgDQpgYGB7cn0NCm1vc2FpY3Bsb3QodGFibGUoZGYkU2lnbm8sIGRmJGBQcmVzZW5jaWEgbyBhdXNlbmNpYWAsIGRmJGBQcmVzZW5jaWEgZGUgUXVlaWxpdGlzIEFjdGluaWNhYCksIA0KICAgICAgICAgICBzaGFkZSA9IFQpDQoNCm1hbnRlbGhhZW4udGVzdCh4ID0gZGYkU2lnbm8sIA0KICAgICAgICAgICAgICAgIHkgPSBkZiRgUHJlc2VuY2lhIG8gYXVzZW5jaWFgLA0KICAgICAgICAgICAgICAgIHogPSBkZiRgUHJlc2VuY2lhIGRlIFF1ZWlsaXRpcyBBY3RpbmljYWAsIA0KICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksIA0KICAgICAgICAgICAgICAgIGNvcnJlY3QgPSBULCANCiAgICAgICAgICAgICAgICBleGFjdCA9IEYsIA0KICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQoNCmBgYA0KDQo=