-
Notifications
You must be signed in to change notification settings - Fork 0
/
e000_tabla_clinicos24_03.r
181 lines (140 loc) · 6.78 KB
/
e000_tabla_clinicos24_03.r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
## e000_tabla_clinicos24_03.r
## 2015-03-26 julenmendieta92@gmail.com
## Modificado: 2015-04-16
## Script completo del análisis de los datos clínicos
date ()
Sys.info ()[c("nodename", "user")]
commandArgs ()
rm (list = ls ())
R.version.string ##"R version 3.1.2 (2014-10-31)"
try (source (".job.r")); try (.job)
setwd (file.path (.job$dir$raw, "clinical"))
ficheros <- dir (pattern = "clinical_patient", recursive= TRUE) #Guardamos en ficheros el stream de cada carpeta y los ficheros que contiene
ficheros
length (ficheros)
lnombres <- list ()
for (fi in ficheros) {
print (fi)
nombres <- unlist (strsplit (readLines (fi)[1], split = "\t"))
#Anexo: todo a minusculas y eliminar espacios si los hay. Con los datos que tengo en principio no hace falta.
nombres <- tolower(nombres)
nombres <- gsub(" ", "_", nombres)
datos0 <- read.table (fi, header = TRUE, sep = "\t", quote = "", col.names = nombres, as.is = TRUE,
na.strings = c("[Not Available]", "[Not Applicable]", "[Not Evaluated]", "[Unknown]"), skip = 3)
datos0[1:3,]
orden <- order (colnames (datos0))
colnames (datos0)[orden]
datos0 <- datos0[,orden]
#
table (sapply (datos0, class))
#Con esto leemos todo lo que hay en el fichero
todo.na <- apply (is.na (datos0), 2, all)
table (todo.na)
datos0 <- datos0[,!todo.na] #Quitamos los datos en los que todo sea NA
lon <- apply (datos0, 2, function (x) length (setdiff (unique (x), NA))) #Guardamos en lon cuantos datos diferentes hay en cada cabecera
table (lon)
#Antes de nada copiamos la columna de genero no sea que se borre al aplicar el filtro
genero <- datos0["gender"]
#Eliminamos las cabeceras que tengan menores de 1 y mayores o iguales de 10
datos0 <- datos0[,(lon > 1 & lon < 10)]
#Y nos aseguramos de que la cebecera de genero permanezca
datos0["gender"] <- genero
datos0[1:3,]
t(t (colnames (datos0))) #Muestra una lista con las columnas que hay en datos0
#El objetivo de esto es quitar lo de sindatos si hay muchos de esos valores
mitad <- length(rownames(datos0))/2
#Con esto nos aseguramos de quitar las columnas donde faltan datos en muchos campos, pero a la hora de guardarlas no aparecera todo como NA, lo cual es mejor
for (ca in colnames(datos0)) {
cantidadSinDatos <- table(datos0$ca == "NA") #Esto nos da cuantos no cumplen esto
try(if (cantidadSinDatos[1] < mitad | length(cantidadSinDatos) == 0) (datos0$ca <- NULL), silent = FALSE) #Si la cantidad de datos reales es inferior a la mitad de datos totales borramos la columna
#A su vez, si la tabla es de longitud cero es que todos los datos son NA, por lo que también borramos
#Con esto vamos quitando donde se encuentre sindatos en un % mayor al 50%. Ponemos try por si no se encuentra ninguna vez sindatos
}
nombres <- colnames(datos0) #Con esto miramos todas las cabeceras que han permanecido hasta ahora
lnombres[[fi]] <- nombres #Guardamos las cabeceras que hay asociadas al nombre del fichero en lnombres
}
nu <- sort (unique (unlist (lnombres))) #Guardamos en una lista todas las cabeceras de columnas que hay sin repetirlas
mat <- matrix (NA, nrow = length (nu), ncol = length (ficheros)) #Creamos una matriz vacia con numero de filas igual a cabeceras posibles y en las columnas el nombre del fichero
rownames (mat) <- nu #Llamamos a las filas de mat como las cabeceras
colnames (mat) <- ficheros #A las columnas como los ficheros
#Con el bucle guardamos un T o F dependiendo de si en el fichero hay una cabecera que se llame como fila[cabecera] de la matriz
for (fi in ficheros) {
mat[,fi] <- rownames (mat) %in% lnombres[[fi]]
}
mat[1:3,]
dim (mat)
table (rowSums (mat)) #Esto nos muestra cuantas cabeceras hay solo en x ficheros (cuantas en 1, cuantas en 2, cuantas en 4 etc.)
colnames (mat) <- NULL
touse <- rowSums (mat) == length(ficheros) #Guardamos solo las cabeceras que esten en todos losficheros
###PROBLEMA: ¿Pregunto al usuario mejor cual quiere que sea el mínimo de columnas?
tamanyofich <- length(ficheros)
##Voy a poner un bucle para incluir datos hasta tener un numero aceptable (digamos 10):
while(table(touse)[[2]] < 10) { #Mientras que el numero de TRUE en touse sea menor que 10
touse[rowSums (mat) == tamanyofich - 1] = TRUE
tamanyofich <- tamanyofich - 1
}
##
touse
mat[touse,]
rownames (mat)[touse] #Muestra los nombres de las 10 cabeceras mas frecuentes
tablist <- list ()
for (fi in ficheros) {
nombres <- unlist (strsplit (readLines (fi)[1], split = "\t"))
datos0 <- read.table (fi, header = TRUE, sep = "\t", quote = "", col.names = nombres, as.is = TRUE, na.strings = "[Not Available]", skip = 3)
#Con esto miramos cuantas columnas de las presentes en todos los datos tenemos hasta ahora
table (colnames(datos0) %in% rownames (mat)[touse])
mantener <- colnames(datos0) %in% rownames (mat)[touse]
#Y las guardamos
datos0 <- datos0[mantener]
##Hasta aqui
print (dim (datos0))
tablist[[fi]] <- datos0
#Con este bucle guardamos en una lista todos los datos que hay en cada fichero
}
summary(tablist)
#Guardamos en excel
setwd (file.path (.job$dir$proces ))
library (xlsx)
####Con esto guardamos en hojas diferentes
primeraVuelta <- TRUE
for (fi in ficheros) {
if (primeraVuelta == TRUE) {
#En la primera vuelta guardamos el primer fichero
write.xlsx2(x = tablist[[fi]], file = "tabla_clinicos.xlsx",
sheetName = fi, col.names = TRUE, row.names = FALSE)
#Y guardamos el orden de las columnas de este fichero
ordencol <- colnames(tablist[[fi]])
primeraVuelta <- FALSE
}
else {
#Con esto guardamos las demas tablas
write.xlsx2(x = tablist[[fi]][c(ordencol)], file = "tabla_clinicos.xlsx",
sheetName = fi, col.names = TRUE, row.names = FALSE, append = TRUE)
}
}
#Con esto se guardaria todo, pero da error por diferente numero de lineas en cada fi
#write.xlsx2(x = tablist, file = "tabla_clinicos2.xlsx",
# sheetName = fi, col.names = TRUE, row.names = FALSE)
####Guardar todo en la misma hoja
library(XLConnect)
primeraVuelta <- TRUE
for (fi in ficheros) {
if (primeraVuelta == TRUE) {
#En la primera vuelta guardamos el primer fichero
write.xlsx2(x = t(colnames(tablist[[fi]])), file = "tabla_clinicos2.xlsx",
sheetName = "Datos", col.names = FALSE, row.names = FALSE)
wb <- loadWorkbook( "tabla_clinicos2.xlsx" )
appendWorksheet( wb, data = fi, sheet = "Datos" )
appendWorksheet( wb, data = tablist[[fi]], sheet = "Datos" )
#Guardamos el orden de las columnas de este fichero
ordencol <- colnames(tablist[[fi]])
primeraVuelta <- FALSE
}
else {
#Con esto guardamos las demas tablas
appendWorksheet( wb, data = fi, sheet = "Datos" )
appendWorksheet( wb, data = tablist[[fi]][c(ordencol)], sheet = "Datos" )
}
}
saveWorkbook( wb )
help(merge)