Discussion:
[R-es] Filtrado de variables
Carlos Ortega
2018-02-22 08:52:25 UTC
Permalink
Hola,

Aquí tienes un par de formas...


Lines <- "MES | VARIABLE | RESULTADO |
1 | A | SI |
1 | B | SI |
1 | C | NO |
2 | A | NA |
2 | B | SI |
2 | C | SI |
3 | A | NO |
3 | B | NO |
3 | C | NO |
4 | A | NA |
4 | B | NA |
4 | C | NA |"

DF <- read.table(textConnection(Lines), header = TRUE, as.is = TRUE, sep =
"|")
DF$X <- NULL

#---------------------
library(data.table)
DT <- as.data.table(DF)
re_dt <- DT[, num_mes :=.N, by=c("MES")][ RESULTADO == " NA ", all_na :=
.N, by=c("MES")][ all_na == num_mes]
unique(re_dt$MES)

#---------------------
library(dplyr)
num_mes <- DF %>%
group_by(MES) %>%
summarize( num_mes = n())

hw_na <- DF %>%
group_by(MES) %>%
filter(RESULTADO == " NA ") %>%
summarize( hw_na = n())

res_out <- left_join(num_mes, hw_na) %>%
filter(num_mes == hw_na)

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 22 de febrero de 2018, 9:22, jose luis via R-help-es <
r-help-***@r-project.org> escribió:

> Buenos díasTengo esta pequeña matriz con tres columnas. Querría saber como
> puedo filtrar el mes en el que todos los campos de la columna RESULTADO son
> NA (en este caso sería unicamente el mes 4). Gracias
> | MES | VARIABLE | RESULTADO |
> | 1 | A | SI |
> | 1 | B | SI |
> | 1 | C | NO |
> | 2 | A | NA |
> | 2 | B | SI |
> | 2 | C | SI |
> | 3 | A | NO |
> | 3 | B | NO |
> | 3 | C | NO |
> | 4 | A | NA |
> | 4 | B | NA |
> | 4 | C | NA |
>
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-***@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Freddy Omar López Quintero
2018-02-22 11:53:42 UTC
Permalink
El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribió:
> Aquí tienes un par de formas...

... y aún una más, con el siempre fiel lenguaje SQL:

library(sqldf)# corriendo antes lo que hizo don Carlos pero dejándolo como un data.frame tradicional:DF<-as.data.frame(DF)sqldf("select * from DF where resultado=' NA '")
¡Saludos!

--
«...homines autem hominum causa esse generatos...»

Cicero
[[alternative HTML version deleted]]
Carlos Ortega
2018-02-22 12:01:18 UTC
Permalink
Nope..,

Sí, puede ser "sqldf" pero de esta forma no te muestra los meses que tienen
todos sus meses con "NA"..
Tienes que hacer primero un conteo de meses y luego un "left join" con el
conteo de "NAs" por mes y quedarte con el mes que tiene los dos valores
iguales (número de meses y número de NAs)...

Estaba probando la opción, pero no he terminado de completarla...

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 22 de febrero de 2018, 12:53, Freddy Omar López Quintero <
***@gmail.com> escribió:

> El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribió:
>
> Aquí tienes un par de formas...
>
>
> ... y aún una más, con el siempre fiel lenguaje SQL:
>
>
> library(sqldf)
>
> # corriendo antes lo que hizo don Carlos pero dejándolo como un data.frame tradicional:
>
> DF<-as.data.frame(DF)
>
> sqldf("select * from DF where resultado=' NA '")
>
>
> ¡Saludos!
>
>
> --
>
> «...homines autem hominum causa esse generatos...»
>
> Cicero
>



--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Freddy Omar López Quintero
2018-02-22 16:10:04 UTC
Permalink
Es cierto, una vez más entendí todo mal. Mis disculpas.

La solución con SQL no va nada corta, me parece:

# filtrar el mes en el que todos los campos de la columna RESULTADO son NA

sqldf("
select *
from DF
where mes in
(
select a.mes from
(
select mes, count(*) as total_NA
from
(select *
from DF
where resultado=' NA ')
group by mes
) a,
(
select mes, count(*) as total_MES
from DF
group by mes
) b

where total_na=total_mes and a.mes=b.mes

)
")

¡Salud!

2018-02-22 9:01 GMT-03:00 Carlos Ortega <***@qualityexcellence.es>:

> Nope..,
>
> Sí, puede ser "sqldf" pero de esta forma no te muestra los meses que
> tienen todos sus meses con "NA"..
> Tienes que hacer primero un conteo de meses y luego un "left join" con el
> conteo de "NAs" por mes y quedarte con el mes que tiene los dos valores
> iguales (número de meses y número de NAs)...
>
> Estaba probando la opción, pero no he terminado de completarla...
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
> El 22 de febrero de 2018, 12:53, Freddy Omar López Quintero <
> ***@gmail.com> escribió:
>
>> El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribió:
>>
>> Aquí tienes un par de formas...
>>
>>
>> ... y aún una más, con el siempre fiel lenguaje SQL:
>>
>>
>> library(sqldf)
>>
>> # corriendo antes lo que hizo don Carlos pero dejándolo como un data.frame tradicional:
>>
>> DF<-as.data.frame(DF)
>>
>> sqldf("select * from DF where resultado=' NA '")
>>
>>
>> ¡Saludos!
>>
>>
>> --
>>
>> «...homines autem hominum causa esse generatos...»
>>
>> Cicero
>>
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>



--
«...my role is to be on the bottom of things.»

Donald Knuth

[[alternative HTML version deleted]]
Javier Nieto
2018-02-22 16:58:14 UTC
Permalink
Hola,


un poco más compacto, mi solución es la siguiente:


DF[is.na(DF$RESULTADO), ]


si se requiere un conteo, con nrow aplicado al resultado anterior.



donde DF es un data frame con la información.


Saludos

________________________________
De: R-help-es <r-help-es-***@r-project.org> en nombre de Freddy Omar López Quintero <***@gmail.com>
Enviado: jueves, 22 de febrero de 2018 10:10:04 a. m.
Para: Carlos Ortega
CC: Lista R.
Asunto: Re: [R-es] Filtrado de variables

Es cierto, una vez más entendí todo mal. Mis disculpas.

La solución con SQL no va nada corta, me parece:

# filtrar el mes en el que todos los campos de la columna RESULTADO son NA

sqldf("
select *
from DF
where mes in
(
select a.mes from
(
select mes, count(*) as total_NA
from
(select *
from DF
where resultado=' NA ')
group by mes
) a,
(
select mes, count(*) as total_MES
from DF
group by mes
) b

where total_na=total_mes and a.mes=b.mes

)
")

¡Salud!

2018-02-22 9:01 GMT-03:00 Carlos Ortega <***@qualityexcellence.es>:

> Nope..,
>
> Sí, puede ser "sqldf" pero de esta forma no te muestra los meses que
> tienen todos sus meses con "NA"..
> Tienes que hacer primero un conteo de meses y luego un "left join" con el
> conteo de "NAs" por mes y quedarte con el mes que tiene los dos valores
> iguales (número de meses y número de NAs)...
>
> Estaba probando la opción, pero no he terminado de completarla...
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es<http://www.qualityexcellence.es>
>
> El 22 de febrero de 2018, 12:53, Freddy Omar López Quintero <
> ***@gmail.com> escribió:
>
>> El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribió:
>>
>> Aquí tienes un par de formas...
>>
>>
>> ... y aún una más, con el siempre fiel lenguaje SQL:
>>
>>
>> library(sqldf)
>>
>> # corriendo antes lo que hizo don Carlos pero dejándolo como un data.frame tradicional:
>>
>> DF<-as.data.frame(DF)
>>
>> sqldf("select * from DF where resultado=' NA '")
>>
>>
>> ¡Saludos!
>>
>>
>> --
>>
>> «...homines autem hominum causa esse generatos...»
>>
>> Cicero
>>
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es<http://www.qualityexcellence.es>
>



--
«...my role is to be on the bottom of things.»

Donald Knuth

[[alternative HTML version deleted]]

_______________________________________________
R-help-es mailing list
R-help-***@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es

[[alternative HTML version deleted]]
Carlos Ortega
2018-02-22 17:13:55 UTC
Permalink
Ya... de esta forma tampoco obtienes el mes que tiene todos sus valores
NA...que es la duda ..

Otra forma más sencilla con data.table que la que envié anteriormente...

>
> Lines <- "MES|VARIABLE|RESULTADO|
+ 1|A|SI|
+ 1|B|SI|
+ 1|C|NO|
+ 2|A|NA|
+ 2|B|SI|
+ 2|C|SI|
+ 3|A|NO|
+ 3|B|NO|
+ 3|C|NO|
+ 4|A|NA|
+ 4|B|NA|
+ 4|C|NA|"
>
> DF <- read.table(textConnection(Lines), header = TRUE, as.is = TRUE, sep
= "|")
> DF$X <- NULL
>
> #---------------------
> library(data.table)
> DT <- as.data.table(DF)
> *DT[ , all(is.na <http://is.na>(RESULTADO)), by=c("MES")][ V1 == TRUE]*
MES V1
1: 4 TRUE

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 22 de febrero de 2018, 17:58, Javier Nieto <***@hotmail.com>
escribió:

> Hola,
>
>
> un poco más compacto, mi solución es la siguiente:
>
>
> DF[is.na(DF$RESULTADO), ]
>
>
> si se requiere un conteo, con nrow aplicado al resultado anterior.
>
>
>
> donde DF es un data frame con la información.
>
>
> Saludos
> ------------------------------
> *De:* R-help-es <r-help-es-***@r-project.org> en nombre de Freddy
> Omar López Quintero <***@gmail.com>
> *Enviado:* jueves, 22 de febrero de 2018 10:10:04 a. m.
> *Para:* Carlos Ortega
> *CC:* Lista R.
> *Asunto:* Re: [R-es] Filtrado de variables
>
> Es cierto, una vez más entendí todo mal. Mis disculpas.
>
> La solución con SQL no va nada corta, me parece:
>
> # filtrar el mes en el que todos los campos de la columna RESULTADO son NA
>
> sqldf("
> select *
> from DF
> where mes in
> (
> select a.mes from
> (
> select mes, count(*) as total_NA
> from
> (select *
> from DF
> where resultado=' NA ')
> group by mes
> ) a,
> (
> select mes, count(*) as total_MES
> from DF
> group by mes
> ) b
>
> where total_na=total_mes and a.mes=b.mes
>
> )
> ")
>
> ¡Salud!
>
> 2018-02-22 9:01 GMT-03:00 Carlos Ortega <***@qualityexcellence.es>:
>
> > Nope..,
> >
> > Sí, puede ser "sqldf" pero de esta forma no te muestra los meses que
> > tienen todos sus meses con "NA"..
> > Tienes que hacer primero un conteo de meses y luego un "left join" con el
> > conteo de "NAs" por mes y quedarte con el mes que tiene los dos valores
> > iguales (número de meses y número de NAs)...
> >
> > Estaba probando la opción, pero no he terminado de completarla...
> >
> > Saludos,
> > Carlos Ortega
> > www.qualityexcellence.es
> >
> > El 22 de febrero de 2018, 12:53, Freddy Omar López Quintero <
> > ***@gmail.com> escribió:
> >
> >> El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribió:
> >>
> >> Aquí tienes un par de formas...
> >>
> >>
> >> ... y aún una más, con el siempre fiel lenguaje SQL:
> >>
> >>
> >> library(sqldf)
> >>
> >> # corriendo antes lo que hizo don Carlos pero dejándolo como un
> data.frame tradicional:
> >>
> >> DF<-as.data.frame(DF)
> >>
> >> sqldf("select * from DF where resultado=' NA '")
> >>
> >>
> >> ¡Saludos!
> >>
> >>
> >> --
> >>
> >> «...homines autem hominum causa esse generatos...»
> >>
> >> Cicero
> >>
> >
> >
> >
> > --
> > Saludos,
> > Carlos Ortega
> > www.qualityexcellence.es
> >
>
>
>
> --
> «...my role is to be on the bottom of things.»
>
> Donald Knuth
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-***@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Javier Nieto
2018-02-22 18:18:55 UTC
Permalink
Tienes razón Carlos. No entendí bien la duda. Me quedo con tu solución.


Saludos

________________________________
De: Carlos Ortega <***@qualityexcellence.es>
Enviado: jueves, 22 de febrero de 2018 11:13:55 a. m.
Para: Javier Nieto
CC: Freddy Omar López Quintero; Lista R.
Asunto: Re: [R-es] Filtrado de variables

Ya... de esta forma tampoco obtienes el mes que tiene todos sus valores NA...que es la duda ..

Otra forma más sencilla con data.table que la que envié anteriormente...

>
> Lines <- "MES|VARIABLE|RESULTADO|
+ 1|A|SI|
+ 1|B|SI|
+ 1|C|NO|
+ 2|A|NA|
+ 2|B|SI|
+ 2|C|SI|
+ 3|A|NO|
+ 3|B|NO|
+ 3|C|NO|
+ 4|A|NA|
+ 4|B|NA|
+ 4|C|NA|"
>
> DF <- read.table(textConnection(Lines), header = TRUE, as.is<http://as.is> = TRUE, sep = "|")
> DF$X <- NULL
>
> #---------------------
> library(data.table)
> DT <- as.data.table(DF)
> DT[ , all(is.na<http://is.na>(RESULTADO)), by=c("MES")][ V1 == TRUE]
MES V1
1: 4 TRUE

Saludos,
Carlos Ortega
www.qualityexcellence.es<http://www.qualityexcellence.es>

El 22 de febrero de 2018, 17:58, Javier Nieto <***@hotmail.com<mailto:***@hotmail.com>> escribió:

Hola,


un poco más compacto, mi solución es la siguiente:


DF[is.na<http://is.na>(DF$RESULTADO), ]


si se requiere un conteo, con nrow aplicado al resultado anterior.



donde DF es un data frame con la información.


Saludos

________________________________
De: R-help-es <r-help-es-***@r-project.org<mailto:r-help-es-***@r-project.org>> en nombre de Freddy Omar López Quintero <***@gmail.com<mailto:***@gmail.com>>
Enviado: jueves, 22 de febrero de 2018 10:10:04 a. m.
Para: Carlos Ortega
CC: Lista R.
Asunto: Re: [R-es] Filtrado de variables

Es cierto, una vez más entendí todo mal. Mis disculpas.

La solución con SQL no va nada corta, me parece:

# filtrar el mes en el que todos los campos de la columna RESULTADO son NA

sqldf("
select *
from DF
where mes in
(
select a.mes from
(
select mes, count(*) as total_NA
from
(select *
from DF
where resultado=' NA ')
group by mes
) a,
(
select mes, count(*) as total_MES
from DF
group by mes
) b

where total_na=total_mes and a.mes=b.mes

)
")

¡Salud!

2018-02-22 9:01 GMT-03:00 Carlos Ortega <***@qualityexcellence.es<mailto:***@qualityexcellence.es>>:

> Nope..,
>
> Sí, puede ser "sqldf" pero de esta forma no te muestra los meses que
> tienen todos sus meses con "NA"..
> Tienes que hacer primero un conteo de meses y luego un "left join" con el
> conteo de "NAs" por mes y quedarte con el mes que tiene los dos valores
> iguales (número de meses y número de NAs)...
>
> Estaba probando la opción, pero no he terminado de completarla...
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es<http://www.qualityexcellence.es>
>
> El 22 de febrero de 2018, 12:53, Freddy Omar López Quintero <
> ***@gmail.com<mailto:***@gmail.com>> escribió:
>
>> El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribió:
>>
>> Aquí tienes un par de formas...
>>
>>
>> ... y aún una más, con el siempre fiel lenguaje SQL:
>>
>>
>> library(sqldf)
>>
>> # corriendo antes lo que hizo don Carlos pero dejándolo como un data.frame tradicional:
>>
>> DF<-as.data.frame(DF)
>>
>> sqldf("select * from DF where resultado=' NA '")
>>
>>
>> ¡Saludos!
>>
>>
>> --
>>
>> «...homines autem hominum causa esse generatos...»
>>
>> Cicero
>>
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es<http://www.qualityexcellence.es>
>



--
«...my role is to be on the bottom of things.»

Donald Knuth

[[alternative HTML version deleted]]

_______________________________________________
R-help-es mailing list
R-help-***@r-project.org<mailto:R-help-***@r-project.org>
https://stat.ethz.ch/mailman/listinfo/r-help-es



--
Saludos,
Carlos Ortega
www.qualityexcellence.es<http://www.qualityexcellence.es>

[[alternative HTML version deleted]]
Álvaro Hernández
2018-02-22 19:26:39 UTC
Permalink
La opción de Carlos con dplyr también se podría simplificar un poco
haciendo los dos 'summarize' a la vez:

DF %>%
  group_by(MES) %>%
  summarize(num_mes = n(), hw_na = sum(RESULTADO == " NA ")) %>%
  filter(num_mes == hw_na)

Un saludo
Álvaro

El 22/02/18 a las 19:18, Javier Nieto escribió:
> Tienes raz�n Carlos. No entend� bien la duda. Me quedo con tu soluci�n.
>
>
> Saludos
>
> ________________________________
> De: Carlos Ortega <***@qualityexcellence.es>
> Enviado: jueves, 22 de febrero de 2018 11:13:55 a. m.
> Para: Javier Nieto
> CC: Freddy Omar L�pez Quintero; Lista R.
> Asunto: Re: [R-es] Filtrado de variables
>
> Ya... de esta forma tampoco obtienes el mes que tiene todos sus valores NA...que es la duda ..
>
> Otra forma m�s sencilla con data.table que la que envi� anteriormente...
>
>> Lines <- "MES|VARIABLE|RESULTADO|
> + 1|A|SI|
> + 1|B|SI|
> + 1|C|NO|
> + 2|A|NA|
> + 2|B|SI|
> + 2|C|SI|
> + 3|A|NO|
> + 3|B|NO|
> + 3|C|NO|
> + 4|A|NA|
> + 4|B|NA|
> + 4|C|NA|"
>> DF <- read.table(textConnection(Lines), header = TRUE, as.is<http://as.is> = TRUE, sep = "|")
>> DF$X <- NULL
>>
>> #---------------------
>> library(data.table)
>> DT <- as.data.table(DF)
>> DT[ , all(is.na<http://is.na>(RESULTADO)), by=c("MES")][ V1 == TRUE]
> MES V1
> 1: 4 TRUE
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es<http://www.qualityexcellence.es>
>
> El 22 de febrero de 2018, 17:58, Javier Nieto <***@hotmail.com<mailto:***@hotmail.com>> escribi�:
>
> Hola,
>
>
> un poco m�s compacto, mi soluci�n es la siguiente:
>
>
> DF[is.na<http://is.na>(DF$RESULTADO), ]
>
>
> si se requiere un conteo, con nrow aplicado al resultado anterior.
>
>
>
> donde DF es un data frame con la informaci�n.
>
>
> Saludos
>
> ________________________________
> De: R-help-es <r-help-es-***@r-project.org<mailto:r-help-es-***@r-project.org>> en nombre de Freddy Omar L�pez Quintero <***@gmail.com<mailto:***@gmail.com>>
> Enviado: jueves, 22 de febrero de 2018 10:10:04 a. m.
> Para: Carlos Ortega
> CC: Lista R.
> Asunto: Re: [R-es] Filtrado de variables
>
> Es cierto, una vez m�s entend� todo mal. Mis disculpas.
>
> La soluci�n con SQL no va nada corta, me parece:
>
> # filtrar el mes en el que todos los campos de la columna RESULTADO son NA
>
> sqldf("
> select *
> from DF
> where mes in
> (
> select a.mes from
> (
> select mes, count(*) as total_NA
> from
> (select *
> from DF
> where resultado=' NA ')
> group by mes
> ) a,
> (
> select mes, count(*) as total_MES
> from DF
> group by mes
> ) b
>
> where total_na=total_mes and a.mes=b.mes
>
> )
> ")
>
> �Salud!
>
> 2018-02-22 9:01 GMT-03:00 Carlos Ortega <***@qualityexcellence.es<mailto:***@qualityexcellence.es>>:
>
>> Nope..,
>>
>> S�, puede ser "sqldf" pero de esta forma no te muestra los meses que
>> tienen todos sus meses con "NA"..
>> Tienes que hacer primero un conteo de meses y luego un "left join" con el
>> conteo de "NAs" por mes y quedarte con el mes que tiene los dos valores
>> iguales (n�mero de meses y n�mero de NAs)...
>>
>> Estaba probando la opci�n, pero no he terminado de completarla...
>>
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es<http://www.qualityexcellence.es>
>>
>> El 22 de febrero de 2018, 12:53, Freddy Omar L�pez Quintero <
>> ***@gmail.com<mailto:***@gmail.com>> escribi�:
>>
>>> El jue, 22-02-2018 a las 09:52 +0100, Carlos Ortega escribi�:
>>>
>>> Aqu� tienes un par de formas...
>>>
>>>
>>> ... y a�n una m�s, con el siempre fiel lenguaje SQL:
>>>
>>>
>>> library(sqldf)
>>>
>>> # corriendo antes lo que hizo don Carlos pero dej�ndolo como un data.frame tradicional:
>>>
>>> DF<-as.data.frame(DF)
>>>
>>> sqldf("select * from DF where resultado=' NA '")
>>>
>>>
>>> �Saludos!
>>>
>>>
>>> --
>>>
>>> �...homines autem hominum causa esse generatos...�
>>>
>>> Cicero
>>>
>>
>>
>> --
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es<http://www.qualityexcellence.es>
>>
>
>
> --
> �...my role is to be on the bottom of things.�
>
> Donald Knuth
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-***@r-project.org<mailto:R-help-***@r-project.org>
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es<http://www.qualityexcellence.es>
>
> [[alternative HTML version deleted]]
>
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-***@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
Loading...