Discussion:
[R-es] Más filtrado de variables
Isidro Hidalgo Arellano
2018-03-07 12:00:09 UTC
Permalink
datos
GRUPO ORDEN CLASE

1 A 1 CLASE-01

2 A 2 CLASE-02

3 A 5 CLASE-03

4 B 1 CLASE-01

5 B 2 CLASE-02

6 B 5 CLASE-03

7 B 7 CLASE-04

8 C 2 CLASE-02

9 C 5 CLASE-03

10 C 7 CLASE-04

11 D 5 CLASE-03

12 D 7 CLASE-04

13 E 1 CLASE-06

14 F 2 CLASE-02

15 F 5 CLASE-03

16 F 7 CLASE-05

17 G 1 CLASE-07
clases = attr(table(datos$CLASE), "names")
grupos = attr(table(datos$GRUPO), "names")
datosFinal = datos[1,]
clases = clases[-1]
grupos = grupos[-1]
for (g in grupos){
+ selec = datos[datos$GRUPO ==g & datos$CLASE %in% clases,]

+ selec = selec[1,]

+ clases = clases[clases != selec$CLASE]

+ datosFinal = rbind(datosFinal, selec)

+ }
datosFinal
GRUPO ORDEN CLASE

1 A 1 CLASE-01

5 B 2 CLASE-02

9 C 5 CLASE-03

12 D 7 CLASE-04

13 E 1 CLASE-06

16 F 7 CLASE-05

17 G 1 CLASE-07



Básicamente es montar un cola con las clases para ir quitándole el valor que va saliendo en cada grupo.



Un saludo



Isidro Hidalgo Arellano

Observatorio del Mercado de Trabajo

Consejería de Economía, Empresas y Empleo

http://www.castillalamancha.es/







De: R-help-es [mailto:r-help-es-***@r-project.org] En nombre de jose luis via R-help-es
Enviado el: miércoles, 07 de marzo de 2018 12:01
Para: jose luis <***@yahoo.es>; Lista R. <r-help-***@r-project.org>
Asunto: Re: [R-es] Más filtrado de variables



Adjunto txt por si no se ve bien, disculpas



El Miércoles 7 de marzo de 2018 11:53, jose luis via R-help-es <r-help-***@r-project.org <mailto:r-help-***@r-project.org> > escribió:



Buenas. A ver si a alguien se le ocurre cómo hacer este filtrado. Quiero seleccionar para cada GRUPO el numero de ORDEN más pequeño (que podría ser con wich.min(ORDEN)), pero sin que se repita la CLASE, de modo que si la CLASE-01 salió en el primer GRUPO ya no salga más.



GRUPO ORDEN CLASE A 1 CLASE-01 A 2 CLASE-02 A 5 CLASE-03 B 1 CLASE-01 B 2 CLASE-02 B 5 CLASE-03 B 7 CLASE-04 C 2 CLASE-02 C 5 CLASE-03 C 7 CLASE-04 D 5 CLASE-03 D 7 CLASE-04 E 1 CLASE-06 F 2 CLASE-02 F 5 CLASE-03 F 7 CLASE-05 G 1 CLASE-07
Tendría que quedarme tal que así:

GRUPO ORDEN CLASE A 1 CLASE-01 B 2 CLASE-02 C 5 CLASE-03 D 7 CLASE-04 E 1 CLASE-06 F 7 CLASE-05 G 1 CLASE-07

Un saludo

Jose Luis

[[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


[[alternative HTML version deleted]]
Javier Marcuzzi
2018-03-07 12:01:26 UTC
Permalink
Estimado José Luis

Supongamos tres datos, los cuáles tienen tres columnas

1,1,1
2,1,1
2,1,2

En este ejemplo está ordenado, pero usted al 2,1,1 no lo desea porque el 1
(clase, último), se repite con el 1 del 1,1,1, todo quedaría filtrado de
esta forma:
1,1,1
2,1,2

Si comprendí su problema yo lo realizaría con números, cada clase tiene un
número, y luego crearía un auxiliar y lo incrementaría (clase<-clase+1), de
tal forma que luego de tener todo ordenado de menor a mayor podría recorrer
con un for buscando el que ya está incrementado (lo incrementé en el ciclo
anterior del for o en el inicio vale 1).

Es una idea para escribir el algoritmo.

Javier Rubén Marcuzzi

El 7 de marzo de 2018, 8:00, jose luis via R-help-es <
Post by Isidro Hidalgo Arellano
Adjunto txt por si no se ve bien, disculpas
El Miércoles 7 de marzo de 2018 11:53, jose luis via R-help-es <
Buenas. A ver si a alguien se le ocurre cómo hacer este filtrado. Quiero
seleccionar para cada GRUPO el numero de ORDEN más pequeño (que podría ser
con wich.min(ORDEN)), pero sin que se repita la CLASE, de modo que si la
CLASE-01 salió en el primer GRUPO ya no salga más.
GRUPO ORDEN CLASE A 1 CLASE-01 A
2 CLASE-02 A 5 CLASE-03 B 1 CLASE-01
B 2 CLASE-02 B 5 CLASE-03 B 7
CLASE-04 C 2 CLASE-02 C 5 CLASE-03 C
7 CLASE-04 D 5 CLASE-03 D 7 CLASE-04
E 1 CLASE-06 F 2 CLASE-02 F 5
CLASE-03 F 7 CLASE-05 G 1 CLASE-07
GRUPO ORDEN CLASE A 1 CLASE-01 B 2
CLASE-02 C 5 CLASE-03 D 7
CLASE-04 E 1 CLASE-06 F 7 CLASE-05
G 1 CLASE-07
Un saludo
Jose Luis
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
[[alternative HTML version deleted]]
Javier Marcuzzi
2018-03-07 12:12:31 UTC
Permalink
José Luis

La forma de Isidro Hidalgo Arellano es buena y clara, básicamente es lo
mismo, uno propone sumar y el otro restar, pero en ambas alternativas hay
un problema, utilizando el ejemplo de Isidro, tengo tres clases, digamos
que gasté las tres, pero las gasté antes de recorrer todos los datos, por
ejemplo tengo 1000 datos y en el 750 fueron utilizadas todas las clases, me
quedarían 250 datos que se descartarían.

Javier Rubén Marcuzzi
Post by Isidro Hidalgo Arellano
datos
GRUPO ORDEN CLASE
1 A 1 CLASE-01
2 A 2 CLASE-02
3 A 5 CLASE-03
4 B 1 CLASE-01
5 B 2 CLASE-02
6 B 5 CLASE-03
7 B 7 CLASE-04
8 C 2 CLASE-02
9 C 5 CLASE-03
10 C 7 CLASE-04
11 D 5 CLASE-03
12 D 7 CLASE-04
13 E 1 CLASE-06
14 F 2 CLASE-02
15 F 5 CLASE-03
16 F 7 CLASE-05
17 G 1 CLASE-07
clases = attr(table(datos$CLASE), "names")
grupos = attr(table(datos$GRUPO), "names")
datosFinal = datos[1,]
clases = clases[-1]
grupos = grupos[-1]
for (g in grupos){
+ selec = datos[datos$GRUPO ==g & datos$CLASE %in% clases,]
+ selec = selec[1,]
+ clases = clases[clases != selec$CLASE]
+ datosFinal = rbind(datosFinal, selec)
+ }
datosFinal
GRUPO ORDEN CLASE
1 A 1 CLASE-01
5 B 2 CLASE-02
9 C 5 CLASE-03
12 D 7 CLASE-04
13 E 1 CLASE-06
16 F 7 CLASE-05
17 G 1 CLASE-07
Básicamente es montar un cola con las clases para ir quitándole el valor
que va saliendo en cada grupo.
Un saludo
Isidro Hidalgo Arellano
Observatorio del Mercado de Trabajo
Consejería de Economía, Empresas y Empleo
http://www.castillalamancha.es/
Enviado el: miércoles, 07 de marzo de 2018 12:01
Asunto: Re: [R-es] Más filtrado de variables
Adjunto txt por si no se ve bien, disculpas
El Miércoles 7 de marzo de 2018 11:53, jose luis via R-help-es <
Buenas. A ver si a alguien se le ocurre cómo hacer este filtrado. Quiero
seleccionar para cada GRUPO el numero de ORDEN más pequeño (que podría ser
con wich.min(ORDEN)), pero sin que se repita la CLASE, de modo que si la
CLASE-01 salió en el primer GRUPO ya no salga más.
GRUPO ORDEN CLASE A 1 CLASE-01 A
2 CLASE-02 A 5 CLASE-03 B 1 CLASE-01
B 2 CLASE-02 B 5 CLASE-03 B 7
CLASE-04 C 2 CLASE-02 C 5 CLASE-03 C
7 CLASE-04 D 5 CLASE-03 D 7 CLASE-04
E 1 CLASE-06 F 2 CLASE-02 F 5
CLASE-03 F 7 CLASE-05 G 1 CLASE-07
GRUPO ORDEN CLASE A 1 CLASE-01 B
2 CLASE-02 C 5 CLASE-03 D 7
CLASE-04 E 1 CLASE-06 F 7 CLASE-05
G 1 CLASE-07
Un saludo
Jose Luis
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
[[alternative HTML version deleted]]
Carlos Ortega
2018-03-07 12:26:44 UTC
Permalink
Hola,

Aquí, tienes otra forma que es bastante sencilla de leer/entender...


Lines <- " GRUPO ORDEN CLASE
1 A 1 CLASE-01
2 A 2 CLASE-02
3 A 5 CLASE-03
4 B 1 CLASE-01
5 B 2 CLASE-02
6 B 5 CLASE-03
7 B 7 CLASE-04
8 C 2 CLASE-02
9 C 5 CLASE-03
10 C 7 CLASE-04
11 D 5 CLASE-03
12 D 7 CLASE-04
13 E 1 CLASE-06
14 F 2 CLASE-02
15 F 5 CLASE-03
16 F 7 CLASE-05
17 G 1 CLASE-07"

library(dplyr)
DF %>%
group_by(GRUPO) %>%
select(GRUPO, ORDEN, CLASE) %>%
filter(ORDEN == min(ORDEN))


Y que produce este resultado...
library(dplyr)
DF %>%
+ group_by(GRUPO) %>%
+ select(GRUPO, ORDEN, CLASE) %>%
+ filter(ORDEN == min(ORDEN))
# A tibble: 7 x 3
# Groups: GRUPO [7]
GRUPO ORDEN CLASE
<chr> <int> <chr>
1 A 1 CLASE-01
2 B 1 CLASE-01
3 C 2 CLASE-02
4 D 5 CLASE-03
5 E 1 CLASE-06
6 F 2 CLASE-02
7 G 1 CLASE-07

Saludos,
Carlos Ortega
www.qualityexcellence.es




El 7 de marzo de 2018, 12:00, jose luis via R-help-es <
Adjunto txt por si no se ve bien, disculpas
El Miércoles 7 de marzo de 2018 11:53, jose luis via R-help-es <
Buenas. A ver si a alguien se le ocurre cómo hacer este filtrado. Quiero
seleccionar para cada GRUPO el numero de ORDEN más pequeño (que podría ser
con wich.min(ORDEN)), pero sin que se repita la CLASE, de modo que si la
CLASE-01 salió en el primer GRUPO ya no salga más.
GRUPO ORDEN CLASE A 1 CLASE-01 A
2 CLASE-02 A 5 CLASE-03 B 1 CLASE-01
B 2 CLASE-02 B 5 CLASE-03 B 7
CLASE-04 C 2 CLASE-02 C 5 CLASE-03 C
7 CLASE-04 D 5 CLASE-03 D 7 CLASE-04
E 1 CLASE-06 F 2 CLASE-02 F 5
CLASE-03 F 7 CLASE-05 G 1 CLASE-07
GRUPO ORDEN CLASE A 1 CLASE-01 B 2
CLASE-02 C 5 CLASE-03 D 7
CLASE-04 E 1 CLASE-06 F 7 CLASE-05
G 1 CLASE-07
Un saludo
Jose Luis
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
_______________________________________________
R-help-es mailing list
https://stat.ethz.ch/mailman/listinfo/r-help-es
--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Carlos Ortega
2018-03-07 12:39:02 UTC
Permalink
Ah, sorry, no había entendido lo de no repetir la primera clase.
¿En este caso con cuál habría que quedarse...?..

Otra forma de hacerlo más compacta (hasta aclarar el punto) es así:


Lines <- " GRUPO ORDEN CLASE
1 A 1 CLASE-01
2 A 2 CLASE-02
3 A 5 CLASE-03
4 B 1 CLASE-01
5 B 2 CLASE-02
6 B 5 CLASE-03
7 B 7 CLASE-04
8 C 2 CLASE-02
9 C 5 CLASE-03
10 C 7 CLASE-04
11 D 5 CLASE-03
12 D 7 CLASE-04
13 E 1 CLASE-06
14 F 2 CLASE-02
15 F 5 CLASE-03
16 F 7 CLASE-05
17 G 1 CLASE-07"

DF <- read.table(textConnection(Lines), header = TRUE, as.is = TRUE)

library(data.table)
DT <- as.data.table(DF)
DT[, .SD[1], by="GRUPO"]
DT[, .SD[1], by="GRUPO"]
GRUPO ORDEN CLASE
1: A 1 CLASE-01
2: B 1 CLASE-01
3: C 2 CLASE-02
4: D 5 CLASE-03
5: E 1 CLASE-06
6: F 2 CLASE-02
7: G 1 CLASE-07
Tienes razón Javier, enseguida se me acaban las CLASES, tendría que
descartar demasiadas.
En el ejemplo de Carlos Ortega estaría perfecto si no se repitiera la
primera CLASE-01.
No se si tendré que tirar por otro lado...
El Miércoles 7 de marzo de 2018 13:26, Carlos Ortega <
Hola,
Aquí, tienes otra forma que es bastante sencilla de leer/entender...
Lines <- " GRUPO ORDEN CLASE
1 A 1 CLASE-01
2 A 2 CLASE-02
3 A 5 CLASE-03
4 B 1 CLASE-01
5 B 2 CLASE-02
6 B 5 CLASE-03
7 B 7 CLASE-04
8 C 2 CLASE-02
9 C 5 CLASE-03
10 C 7 CLASE-04
11 D 5 CLASE-03
12 D 7 CLASE-04
13 E 1 CLASE-06
14 F 2 CLASE-02
15 F 5 CLASE-03
16 F 7 CLASE-05
17 G 1 CLASE-07"
library(dplyr)
DF %>%
group_by(GRUPO) %>%
select(GRUPO, ORDEN, CLASE) %>%
filter(ORDEN == min(ORDEN))
Y que produce este resultado...
Post by Carlos Ortega
library(dplyr)
DF %>%
+ group_by(GRUPO) %>%
+ select(GRUPO, ORDEN, CLASE) %>%
+ filter(ORDEN == min(ORDEN))
# A tibble: 7 x 3
# Groups: GRUPO [7]
GRUPO ORDEN CLASE
<chr> <int> <chr>
1 A 1 CLASE-01
2 B 1 CLASE-01
3 C 2 CLASE-02
4 D 5 CLASE-03
5 E 1 CLASE-06
6 F 2 CLASE-02
7 G 1 CLASE-07
Saludos,
Carlos Ortega
www.qualityexcellence.es
El 7 de marzo de 2018, 12:00, jose luis via R-help-es <
Adjunto txt por si no se ve bien, disculpas
El Miércoles 7 de marzo de 2018 11:53, jose luis via R-help-es <
Buenas. A ver si a alguien se le ocurre cómo hacer este filtrado. Quiero
seleccionar para cada GRUPO el numero de ORDEN más pequeño (que podría ser
con wich.min(ORDEN)), pero sin que se repita la CLASE, de modo que si la
CLASE-01 salió en el primer GRUPO ya no salga más.
GRUPO ORDEN CLASE A 1 CLASE-01 A
2 CLASE-02 A 5 CLASE-03 B 1 CLASE-01
B 2 CLASE-02 B 5 CLASE-03 B 7
CLASE-04 C 2 CLASE-02 C 5 CLASE-03 C
7 CLASE-04 D 5 CLASE-03 D 7 CLASE-04
E 1 CLASE-06 F 2 CLASE-02 F 5
CLASE-03 F 7 CLASE-05 G 1 CLASE-07
GRUPO ORDEN CLASE A 1 CLASE-01 B 2
CLASE-02 C 5 CLASE-03 D 7
CLASE-04 E 1 CLASE-06 F 7 CLASE-05
G 1 CLASE-07
Un saludo
Jose Luis
[[alternative HTML version deleted]]
______________________________ _________________
R-help-es mailing list
https://stat.ethz.ch/mailman/ listinfo/r-help-es
<https://stat.ethz.ch/mailman/listinfo/r-help-es>
______________________________ _________________
R-help-es mailing list
https://stat.ethz.ch/mailman/ listinfo/r-help-es
<https://stat.ethz.ch/mailman/listinfo/r-help-es>
--
Saludos,
Carlos Ortega
www.qualityexcellence.es
--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Isidro Hidalgo Arellano
2018-03-07 12:51:50 UTC
Permalink
datos
GRUPO ORDEN CLASE

1 A 1 CLASE-01

2 A 2 CLASE-02

3 A 5 CLASE-03

4 B 1 CLASE-01

5 B 2 CLASE-02

6 B 5 CLASE-03

7 B 7 CLASE-04

8 C 2 CLASE-02

9 C 5 CLASE-03

10 C 7 CLASE-04

11 D 5 CLASE-03

12 D 7 CLASE-04

13 E 1 CLASE-06

14 F 2 CLASE-02

15 F 5 CLASE-03

16 F 7 CLASE-05

17 G 1 CLASE-07
clases = attr(table(datos$CLASE), "names")
grupos = attr(table(datos$GRUPO), "names")
datosFinal = datos[1,]
clases = clases[-1]
grupos = grupos[-1]
for (g in grupos){
+ selec = datos[datos$GRUPO ==g & datos$CLASE %in% clases,]

+ selec = selec[1,]

+ clases = clases[clases != selec$CLASE]

+ datosFinal = rbind(datosFinal, selec)

+ }
datosFinal
GRUPO ORDEN CLASE

1 A 1 CLASE-01

5 B 2 CLASE-02

9 C 5 CLASE-03

12 D 7 CLASE-04

13 E 1 CLASE-06

16 F 7 CLASE-05

17 G 1 CLASE-07





Un saludo



Isidro Hidalgo Arellano

Observatorio del Mercado de Trabajo

Consejería de Economía, Empresas y Empleo

http://www.castillalamancha.es/





De: Isidro Hidalgo Arellano [mailto:***@jccm.es]
Enviado el: miércoles, 07 de marzo de 2018 13:00
Para: 'jose luis' <***@yahoo.es>; 'r-help-***@r-project.org' <r-help-***@r-project.org>
Asunto: RE: [R-es] Más filtrado de variables
datos
GRUPO ORDEN CLASE

1 A 1 CLASE-01

2 A 2 CLASE-02

3 A 5 CLASE-03

4 B 1 CLASE-01

5 B 2 CLASE-02

6 B 5 CLASE-03

7 B 7 CLASE-04

8 C 2 CLASE-02

9 C 5 CLASE-03

10 C 7 CLASE-04

11 D 5 CLASE-03

12 D 7 CLASE-04

13 E 1 CLASE-06

14 F 2 CLASE-02

15 F 5 CLASE-03

16 F 7 CLASE-05

17 G 1 CLASE-07
clases = attr(table(datos$CLASE), "names")
grupos = attr(table(datos$GRUPO), "names")
datosFinal = datos[1,]
clases = clases[-1]
grupos = grupos[-1]
for (g in grupos){
+ selec = datos[datos$GRUPO ==g & datos$CLASE %in% clases,]

+ selec = selec[1,]

+ clases = clases[clases != selec$CLASE]

+ datosFinal = rbind(datosFinal, selec)

+ }
datosFinal
GRUPO ORDEN CLASE

1 A 1 CLASE-01

5 B 2 CLASE-02

9 C 5 CLASE-03

12 D 7 CLASE-04

13 E 1 CLASE-06

16 F 7 CLASE-05

17 G 1 CLASE-07



Básicamente es montar un cola con las clases para ir quitándole el valor que va saliendo en cada grupo.



Un saludo



Isidro Hidalgo Arellano

Observatorio del Mercado de Trabajo

Consejería de Economía, Empresas y Empleo

http://www.castillalamancha.es/







De: R-help-es [mailto:r-help-es-***@r-project.org] En nombre de jose luis via R-help-es
Enviado el: miércoles, 07 de marzo de 2018 12:01
Para: jose luis <***@yahoo.es <mailto:***@yahoo.es> >; Lista R. <r-help-***@r-project.org <mailto:r-help-***@r-project.org> >
Asunto: Re: [R-es] Más filtrado de variables



Adjunto txt por si no se ve bien, disculpas



El Miércoles 7 de marzo de 2018 11:53, jose luis via R-help-es <r-help-***@r-project.org <mailto:r-help-***@r-project.org> > escribió:



Buenas. A ver si a alguien se le ocurre cómo hacer este filtrado. Quiero seleccionar para cada GRUPO el numero de ORDEN más pequeño (que podría ser con wich.min(ORDEN)), pero sin que se repita la CLASE, de modo que si la CLASE-01 salió en el primer GRUPO ya no salga más.



GRUPO ORDEN CLASE A 1 CLASE-01 A 2 CLASE-02 A 5 CLASE-03 B 1 CLASE-01 B 2 CLASE-02 B 5 CLASE-03 B 7 CLASE-04 C 2 CLASE-02 C 5 CLASE-03 C 7 CLASE-04 D 5 CLASE-03 D 7 CLASE-04 E 1 CLASE-06 F 2 CLASE-02 F 5 CLASE-03 F 7 CLASE-05 G 1 CLASE-07
Tendría que quedarme tal que así:

GRUPO ORDEN CLASE A 1 CLASE-01 B 2 CLASE-02 C 5 CLASE-03 D 7 CLASE-04 E 1 CLASE-06 F 7 CLASE-05 G 1 CLASE-07

Un saludo

Jose Luis

[[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


[[alternative HTML version deleted]]

Loading...