Manuel Spínola
2012-Jul-03 15:27 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Estimados miembros de la lista, La semana pasada hice una pregunta sobre como obtener la suma de columnas condicionado por otras columnas. Ahora quisiera saber como hacerlo pero para obtener datos de presencia (1) y ausencia (0) y que ignore los NA. Por ejemplo, especie año sitio col1 A 2008 1 1 A 2008 2 0 A 2008 3 1 B 2008 1 0 B 2008 2 1 B 2008 3 0 A 2009 1 1 A 2009 2 NA A 2009 3 0 B 2009 1 1 B 2009 2 0 B 2009 3 0 Es decir, que como resultado obtenga, en el caso de especie A y sitio 1, como para los 2 años fue 1, el resultado sea de 1, en el caso de especie A y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería sea 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es 0, el resultado final debería sea 1. especie sitio col1 A 1 1 A 2 0 A 3 1 B 1 1 B 2 1 B 3 0 Saludos, Manuel -- *Manuel Spínola, Ph.D.* Instituto Internacional en Conservación y Manejo de Vida Silvestre Universidad Nacional Apartado 1350-3000 Heredia COSTA RICA mspinola@una.ac.cr mspinola10@gmail.com Teléfono: (506) 2277-3598 Fax: (506) 2237-7036 Personal website: Lobito de río <https://sites.google.com/site/lobitoderio/> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> [[alternative HTML version deleted]]
Luciano Selzer
2012-Jul-03 15:41 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Hooa Manuel, Usa any(col1, na.rm = TRUE) podes usar tapply o plyr::ddply with(datos, tapply(col1, especie, any, na.rm = TRUE) ddply(datos, .(especie), function(x) any(x, na.rm = TRUE) Saludos Luciano El 3 de julio de 2012 12:27, Manuel Spínola <mspinola10@gmail.com> escribió:> Estimados miembros de la lista, > > La semana pasada hice una pregunta sobre como obtener la suma de columnas > condicionado por otras columnas. > > Ahora quisiera saber como hacerlo pero para obtener datos de presencia (1) > y ausencia (0) y que ignore los NA. > > Por ejemplo, > > especie año sitio col1 > > A 2008 1 1 > A 2008 2 0 > A 2008 3 1 > B 2008 1 0 > B 2008 2 1 > B 2008 3 0 > A 2009 1 1 > A 2009 2 NA > A 2009 3 0 > B 2009 1 1 > B 2009 2 0 > B 2009 3 0 > > Es decir, que como resultado obtenga, en el caso de especie A y sitio 1, > como para los 2 años fue 1, el resultado sea de 1, en el caso de especie A > y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería sea > 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es 0, el > resultado final debería sea 1. > > especie sitio col1 > A 1 1 > A 2 0 > A 3 1 > B 1 1 > B 2 1 > B 3 0 > > Saludos, > > Manuel > > > -- > *Manuel Spínola, Ph.D.* > Instituto Internacional en Conservación y Manejo de Vida Silvestre > Universidad Nacional > Apartado 1350-3000 > Heredia > COSTA RICA > mspinola@una.ac.cr > mspinola10@gmail.com > Teléfono: (506) 2277-3598 > Fax: (506) 2237-7036 > Personal website: Lobito de río < > https://sites.google.com/site/lobitoderio/> > Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Jorge I Velez
2012-Jul-03 15:48 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Hola Manuel, Podrias intentar d <- structure(list(especie = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, 2009L, 2009L, 2009L, 2009L, 2009L), sitio = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), col1 = c(1L, 0L, 1L, 0L, 1L, 0L, 1L, NA, 0L, 1L, 0L, 0L)), .Names = c("especie", "año", "sitio", "col1"), class = "data.frame", row.names = c(NA, -12L)) r <- with(d, aggregate(col1, list(especie = especie, sitio = sitio), FUN = function(x) sum(unique(x), na.rm = TRUE))) r[with(r, order(especie, sitio)),] Un saludo, Jorge.- 2012/7/3 Manuel Spínola <>> Estimados miembros de la lista, > > La semana pasada hice una pregunta sobre como obtener la suma de columnas > condicionado por otras columnas. > > Ahora quisiera saber como hacerlo pero para obtener datos de presencia (1) > y ausencia (0) y que ignore los NA. > > Por ejemplo, > > especie año sitio col1 > > A 2008 1 1 > A 2008 2 0 > A 2008 3 1 > B 2008 1 0 > B 2008 2 1 > B 2008 3 0 > A 2009 1 1 > A 2009 2 NA > A 2009 3 0 > B 2009 1 1 > B 2009 2 0 > B 2009 3 0 > > Es decir, que como resultado obtenga, en el caso de especie A y sitio 1, > como para los 2 años fue 1, el resultado sea de 1, en el caso de especie A > y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería sea > 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es 0, el > resultado final debería sea 1. > > especie sitio col1 > A 1 1 > A 2 0 > A 3 1 > B 1 1 > B 2 1 > B 3 0 > > Saludos, > > Manuel > > > -- > *Manuel Spínola, Ph.D.* > Instituto Internacional en Conservación y Manejo de Vida Silvestre > Universidad Nacional > Apartado 1350-3000 > Heredia > COSTA RICA > mspinola@una.ac.cr > mspinola10@gmail.com > Teléfono: (506) 2277-3598 > Fax: (506) 2237-7036 > Personal website: Lobito de río < > https://sites.google.com/site/lobitoderio/> > Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Manuel Spínola
2012-Jul-03 16:05 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Muchas gracias a todos. Como estoy trabajando con aggregate estoy siguiendo la recomendación de Jorge. Cómo utilizo el argumento, FUN = function(x) sum(unique(x)? No me puedo dar cuenta de como usar este argumento "function(x) sum(unique(x)". Saludos, Manuel El 3 de julio de 2012 09:48, Jorge I Velez <jorgeivanvelez@gmail.com>escribió:> Hola Manuel, > > Podrias intentar > > d <- structure(list(especie = structure(c(1L, 1L, 1L, 2L, 2L, 2L, > 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), > year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, > 2009L, 2009L, 2009L, 2009L, 2009L), sitio = c(1L, 2L, 3L, > 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), col1 = c(1L, 0L, 1L, > 0L, 1L, 0L, 1L, NA, 0L, 1L, 0L, 0L)), .Names = c("especie", > "año", "sitio", "col1"), class = "data.frame", row.names = c(NA, > -12L)) > r <- with(d, aggregate(col1, list(especie = especie, sitio = sitio), > FUN = function(x) sum(unique(x), na.rm = TRUE))) > r[with(r, order(especie, sitio)),] > > Un saludo, > Jorge.- > > > 2012/7/3 Manuel Spínola <> > >> Estimados miembros de la lista, >> >> La semana pasada hice una pregunta sobre como obtener la suma de columnas >> condicionado por otras columnas. >> >> Ahora quisiera saber como hacerlo pero para obtener datos de presencia (1) >> y ausencia (0) y que ignore los NA. >> >> Por ejemplo, >> >> especie año sitio col1 >> >> A 2008 1 1 >> A 2008 2 0 >> A 2008 3 1 >> B 2008 1 0 >> B 2008 2 1 >> B 2008 3 0 >> A 2009 1 1 >> A 2009 2 NA >> A 2009 3 0 >> B 2009 1 1 >> B 2009 2 0 >> B 2009 3 0 >> >> Es decir, que como resultado obtenga, en el caso de especie A y sitio 1, >> como para los 2 años fue 1, el resultado sea de 1, en el caso de especie A >> y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería sea >> 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es 0, >> el >> resultado final debería sea 1. >> >> especie sitio col1 >> A 1 1 >> A 2 0 >> A 3 1 >> B 1 1 >> B 2 1 >> B 3 0 >> >> Saludos, >> >> Manuel >> >> >> -- >> *Manuel Spínola, Ph.D.* >> >> Instituto Internacional en Conservación y Manejo de Vida Silvestre >> Universidad Nacional >> Apartado 1350-3000 >> Heredia >> COSTA RICA >> mspinola@una.ac.cr >> mspinola10@gmail.com >> Teléfono: (506) 2277-3598 >> Fax: (506) 2237-7036 >> Personal website: Lobito de río < >> https://sites.google.com/site/lobitoderio/> >> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >-- *Manuel Spínola, Ph.D.* Instituto Internacional en Conservación y Manejo de Vida Silvestre Universidad Nacional Apartado 1350-3000 Heredia COSTA RICA mspinola@una.ac.cr mspinola10@gmail.com Teléfono: (506) 2277-3598 Fax: (506) 2237-7036 Personal website: Lobito de río <https://sites.google.com/site/lobitoderio/> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> [[alternative HTML version deleted]]
Jorge I Velez
2012-Jul-03 16:15 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Hola Manuel, El argumento FUN corresponde a la funcion que debe aplicarse al vector de valores x que resulta de la division (en partes) de tus datos col1 cuando consideras especies y sitio. Por ejemplo, consideremos los datos para la especie A en el sitio 2: subset(d, especie == "A" & sitio == "2") especie año sitio col1 2 A 2008 2 0 8 A 2009 2 NA En este caso, interesa un 0 como resultado. Cuando haces la particion de los datos por especie y sitio, obtienes el vector x <- c(0, NA) y al hacer unique(x) obtienes x. Ahora, sum(unique(x), na.rm = TRUE) sera 0 (que es lo que necesitas). En el caso en que col1 sea por ejemplo y <- c(1, 1), el resultado de unique(y) sera 1 y la suma de ese resultado sera 1, que corresponde exactamente a lo que describiste en tu email a la lista. En general, uso unique() para deshacerme de los valores que se repiten porque solo te interesa uno de ellos, y el argumento na.rm = TRUE en sum() lo utilizo para no considerar los NA. Espero que ahora sea un poco mas claro ;-) Un saludo, Jorge.- 2012/7/3 Manuel Spínola <mspinola10@gmail.com>> Muchas gracias a todos. > > Como estoy trabajando con aggregate estoy siguiendo la recomendación de > Jorge. > > Cómo utilizo el argumento, FUN = function(x) sum(unique(x)? > > No me puedo dar cuenta de como usar este argumento "function(x) > sum(unique(x)". > > Saludos, > > Manuel > > El 3 de julio de 2012 09:48, Jorge I Velez <jorgeivanvelez@gmail.com>escribió: > > Hola Manuel, >> >> Podrias intentar >> >> d <- structure(list(especie = structure(c(1L, 1L, 1L, 2L, 2L, 2L, >> 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), >> year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, >> 2009L, 2009L, 2009L, 2009L, 2009L), sitio = c(1L, 2L, 3L, >> 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), col1 = c(1L, 0L, 1L, >> 0L, 1L, 0L, 1L, NA, 0L, 1L, 0L, 0L)), .Names = c("especie", >> "año", "sitio", "col1"), class = "data.frame", row.names = c(NA, >> -12L)) >> r <- with(d, aggregate(col1, list(especie = especie, sitio = sitio), >> FUN = function(x) sum(unique(x), na.rm = TRUE))) >> r[with(r, order(especie, sitio)),] >> >> Un saludo, >> Jorge.- >> >> >> 2012/7/3 Manuel Spínola <> >> >>> Estimados miembros de la lista, >>> >>> La semana pasada hice una pregunta sobre como obtener la suma de columnas >>> condicionado por otras columnas. >>> >>> Ahora quisiera saber como hacerlo pero para obtener datos de presencia >>> (1) >>> y ausencia (0) y que ignore los NA. >>> >>> Por ejemplo, >>> >>> especie año sitio col1 >>> >>> A 2008 1 1 >>> A 2008 2 0 >>> A 2008 3 1 >>> B 2008 1 0 >>> B 2008 2 1 >>> B 2008 3 0 >>> A 2009 1 1 >>> A 2009 2 NA >>> A 2009 3 0 >>> B 2009 1 1 >>> B 2009 2 0 >>> B 2009 3 0 >>> >>> Es decir, que como resultado obtenga, en el caso de especie A y sitio 1, >>> como para los 2 años fue 1, el resultado sea de 1, en el caso de especie >>> A >>> y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería >>> sea >>> 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es 0, >>> el >>> resultado final debería sea 1. >>> >>> especie sitio col1 >>> A 1 1 >>> A 2 0 >>> A 3 1 >>> B 1 1 >>> B 2 1 >>> B 3 0 >>> >>> Saludos, >>> >>> Manuel >>> >>> >>> -- >>> *Manuel Spínola, Ph.D.* >>> >>> Instituto Internacional en Conservación y Manejo de Vida Silvestre >>> Universidad Nacional >>> Apartado 1350-3000 >>> Heredia >>> COSTA RICA >>> mspinola@una.ac.cr >>> mspinola10@gmail.com >>> Teléfono: (506) 2277-3598 >>> Fax: (506) 2237-7036 >>> Personal website: Lobito de río < >>> https://sites.google.com/site/lobitoderio/> >>> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >>> >>> [[alternative HTML version deleted]] >>> >>> >>> _______________________________________________ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >>> >> > > > -- > *Manuel Spínola, Ph.D.* > Instituto Internacional en Conservación y Manejo de Vida Silvestre > Universidad Nacional > Apartado 1350-3000 > Heredia > COSTA RICA > mspinola@una.ac.cr > mspinola10@gmail.com > Teléfono: (506) 2277-3598 > Fax: (506) 2237-7036 > Personal website: Lobito de río<https://sites.google.com/site/lobitoderio/> > Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >[[alternative HTML version deleted]]
Manuel Spínola
2012-Jul-03 17:20 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Muchas gracias Jorge. Lamentablemente todavía no lo entiendo. ¿Entonces debo escribir una función y luego sum(unique(x, na.rm = TRUE))? Saludos. Manuel El 3 de julio de 2012 10:15, Jorge I Velez <jorgeivanvelez@gmail.com>escribió:> Hola Manuel, > > El argumento FUN corresponde a la funcion que debe aplicarse al vector de > valores x que resulta de la division (en partes) de tus datos col1 cuando > consideras especies y sitio. Por ejemplo, consideremos los datos para la > especie A en el sitio 2: > > subset(d, especie == "A" & sitio == "2") > especie año sitio col1 > 2 A 2008 2 0 > 8 A 2009 2 NA > > En este caso, interesa un 0 como resultado. Cuando haces la particion de > los datos por especie y sitio, obtienes el vector > > x <- c(0, NA) > > y al hacer unique(x) obtienes x. Ahora, sum(unique(x), na.rm = TRUE) > sera 0 (que es lo que necesitas). En el caso en que col1 sea por ejemplo y > <- c(1, 1), el resultado de unique(y) sera 1 y la suma de ese resultado > sera 1, que corresponde exactamente a lo que describiste en tu email a la > lista. En general, uso unique() para deshacerme de los valores que se > repiten porque solo te interesa uno de ellos, y el argumento na.rm = TRUE > en sum() lo utilizo para no considerar los NA. > > Espero que ahora sea un poco mas claro ;-) > > Un saludo, > Jorge.- > > > 2012/7/3 Manuel Spínola <mspinola10@gmail.com> > >> Muchas gracias a todos. >> >> Como estoy trabajando con aggregate estoy siguiendo la recomendación de >> Jorge. >> >> Cómo utilizo el argumento, FUN = function(x) sum(unique(x)? >> >> No me puedo dar cuenta de como usar este argumento "function(x) >> sum(unique(x)". >> >> Saludos, >> >> Manuel >> >> El 3 de julio de 2012 09:48, Jorge I Velez <jorgeivanvelez@gmail.com>escribió: >> >> Hola Manuel, >>> >>> Podrias intentar >>> >>> d <- structure(list(especie = structure(c(1L, 1L, 1L, 2L, 2L, 2L, >>> 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), >>> year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, >>> 2009L, 2009L, 2009L, 2009L, 2009L), sitio = c(1L, 2L, 3L, >>> 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), col1 = c(1L, 0L, 1L, >>> 0L, 1L, 0L, 1L, NA, 0L, 1L, 0L, 0L)), .Names = c("especie", >>> "año", "sitio", "col1"), class = "data.frame", row.names = c(NA, >>> -12L)) >>> r <- with(d, aggregate(col1, list(especie = especie, sitio = sitio), >>> FUN = function(x) sum(unique(x), na.rm = TRUE))) >>> r[with(r, order(especie, sitio)),] >>> >>> Un saludo, >>> Jorge.- >>> >>> >>> 2012/7/3 Manuel Spínola <> >>> >>>> Estimados miembros de la lista, >>>> >>>> La semana pasada hice una pregunta sobre como obtener la suma de >>>> columnas >>>> condicionado por otras columnas. >>>> >>>> Ahora quisiera saber como hacerlo pero para obtener datos de presencia >>>> (1) >>>> y ausencia (0) y que ignore los NA. >>>> >>>> Por ejemplo, >>>> >>>> especie año sitio col1 >>>> >>>> A 2008 1 1 >>>> A 2008 2 0 >>>> A 2008 3 1 >>>> B 2008 1 0 >>>> B 2008 2 1 >>>> B 2008 3 0 >>>> A 2009 1 1 >>>> A 2009 2 NA >>>> A 2009 3 0 >>>> B 2009 1 1 >>>> B 2009 2 0 >>>> B 2009 3 0 >>>> >>>> Es decir, que como resultado obtenga, en el caso de especie A y sitio 1, >>>> como para los 2 años fue 1, el resultado sea de 1, en el caso de >>>> especie A >>>> y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería >>>> sea >>>> 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es >>>> 0, el >>>> resultado final debería sea 1. >>>> >>>> especie sitio col1 >>>> A 1 1 >>>> A 2 0 >>>> A 3 1 >>>> B 1 1 >>>> B 2 1 >>>> B 3 0 >>>> >>>> Saludos, >>>> >>>> Manuel >>>> >>>> >>>> -- >>>> *Manuel Spínola, Ph.D.* >>>> >>>> Instituto Internacional en Conservación y Manejo de Vida Silvestre >>>> Universidad Nacional >>>> Apartado 1350-3000 >>>> Heredia >>>> COSTA RICA >>>> mspinola@una.ac.cr >>>> mspinola10@gmail.com >>>> Teléfono: (506) 2277-3598 >>>> Fax: (506) 2237-7036 >>>> Personal website: Lobito de río < >>>> https://sites.google.com/site/lobitoderio/> >>>> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >>>> >>>> [[alternative HTML version deleted]] >>>> >>>> >>>> _______________________________________________ >>>> R-help-es mailing list >>>> R-help-es@r-project.org >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>> >>>> >>> >> >> >> -- >> *Manuel Spínola, Ph.D.* >> Instituto Internacional en Conservación y Manejo de Vida Silvestre >> Universidad Nacional >> Apartado 1350-3000 >> Heredia >> COSTA RICA >> mspinola@una.ac.cr >> mspinola10@gmail.com >> Teléfono: (506) 2277-3598 >> Fax: (506) 2237-7036 >> Personal website: Lobito de río<https://sites.google.com/site/lobitoderio/> >> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >> > >-- *Manuel Spínola, Ph.D.* Instituto Internacional en Conservación y Manejo de Vida Silvestre Universidad Nacional Apartado 1350-3000 Heredia COSTA RICA mspinola@una.ac.cr mspinola10@gmail.com Teléfono: (506) 2277-3598 Fax: (506) 2237-7036 Personal website: Lobito de río <https://sites.google.com/site/lobitoderio/> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> [[alternative HTML version deleted]]
Jorge I Velez
2012-Jul-03 18:06 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Hola Manuel, No te preocupes. La funcion en este caso es f <- function(x) sum(unique(x), na.rm = TRUE) de tal forma que with(d, aggregate(col1, list(especie = especie, sitio = sitio), f)) deberia darte el mismo resultado que antes. En la sintaxis de aggregate() el argumento FUN = ... corresponde a la funcion que debe aplicarse (ver ?aggregate para mas informacion), pero esa funcion puede ser creada explicitamente (como acabo de hacerlo al definir f) o implicitamente (como en mi respuesta anterior). Esto ultimo tambien es conocido como "on the fly". Espero que ahora todo tenga mas sentido ;-) Jorge.- 2012/7/3 Manuel Spínola <>> Muchas gracias Jorge. > > Lamentablemente todavía no lo entiendo. ¿Entonces debo escribir una > función y luego sum(unique(x, na.rm = TRUE))? > > Saludos. > > Manuel > > El 3 de julio de 2012 10:15, Jorge I Velez <> escribió: > > Hola Manuel, >> >> El argumento FUN corresponde a la funcion que debe aplicarse al vector de >> valores x que resulta de la division (en partes) de tus datos col1 cuando >> consideras especies y sitio. Por ejemplo, consideremos los datos para la >> especie A en el sitio 2: >> >> subset(d, especie == "A" & sitio == "2") >> especie año sitio col1 >> 2 A 2008 2 0 >> 8 A 2009 2 NA >> >> En este caso, interesa un 0 como resultado. Cuando haces la particion de >> los datos por especie y sitio, obtienes el vector >> >> x <- c(0, NA) >> >> y al hacer unique(x) obtienes x. Ahora, sum(unique(x), na.rm = TRUE) >> sera 0 (que es lo que necesitas). En el caso en que col1 sea por ejemplo y >> <- c(1, 1), el resultado de unique(y) sera 1 y la suma de ese resultado >> sera 1, que corresponde exactamente a lo que describiste en tu email a la >> lista. En general, uso unique() para deshacerme de los valores que se >> repiten porque solo te interesa uno de ellos, y el argumento na.rm = TRUE >> en sum() lo utilizo para no considerar los NA. >> >> Espero que ahora sea un poco mas claro ;-) >> >> Un saludo, >> Jorge.- >> >> >> 2012/7/3 Manuel Spínola <mspinola10@gmail.com> >> >>> Muchas gracias a todos. >>> >>> Como estoy trabajando con aggregate estoy siguiendo la recomendación de >>> Jorge. >>> >>> Cómo utilizo el argumento, FUN = function(x) sum(unique(x)? >>> >>> No me puedo dar cuenta de como usar este argumento "function(x) >>> sum(unique(x)". >>> >>> Saludos, >>> >>> Manuel >>> >>> El 3 de julio de 2012 09:48, Jorge I Velez <jorgeivanvelez@gmail.com>escribió: >>> >>> Hola Manuel, >>>> >>>> Podrias intentar >>>> >>>> d <- structure(list(especie = structure(c(1L, 1L, 1L, 2L, 2L, 2L, >>>> 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), >>>> year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, >>>> 2009L, 2009L, 2009L, 2009L, 2009L), sitio = c(1L, 2L, 3L, >>>> 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), col1 = c(1L, 0L, 1L, >>>> 0L, 1L, 0L, 1L, NA, 0L, 1L, 0L, 0L)), .Names = c("especie", >>>> "año", "sitio", "col1"), class = "data.frame", row.names = c(NA, >>>> -12L)) >>>> r <- with(d, aggregate(col1, list(especie = especie, sitio = sitio), >>>> FUN = function(x) sum(unique(x), na.rm = TRUE))) >>>> r[with(r, order(especie, sitio)),] >>>> >>>> Un saludo, >>>> Jorge.- >>>> >>>> >>>> 2012/7/3 Manuel Spínola <> >>>> >>>>> Estimados miembros de la lista, >>>>> >>>>> La semana pasada hice una pregunta sobre como obtener la suma de >>>>> columnas >>>>> condicionado por otras columnas. >>>>> >>>>> Ahora quisiera saber como hacerlo pero para obtener datos de presencia >>>>> (1) >>>>> y ausencia (0) y que ignore los NA. >>>>> >>>>> Por ejemplo, >>>>> >>>>> especie año sitio col1 >>>>> >>>>> A 2008 1 1 >>>>> A 2008 2 0 >>>>> A 2008 3 1 >>>>> B 2008 1 0 >>>>> B 2008 2 1 >>>>> B 2008 3 0 >>>>> A 2009 1 1 >>>>> A 2009 2 NA >>>>> A 2009 3 0 >>>>> B 2009 1 1 >>>>> B 2009 2 0 >>>>> B 2009 3 0 >>>>> >>>>> Es decir, que como resultado obtenga, en el caso de especie A y sitio >>>>> 1, >>>>> como para los 2 años fue 1, el resultado sea de 1, en el caso de >>>>> especie A >>>>> y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado debería >>>>> sea >>>>> 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es >>>>> 0, el >>>>> resultado final debería sea 1. >>>>> >>>>> especie sitio col1 >>>>> A 1 1 >>>>> A 2 0 >>>>> A 3 1 >>>>> B 1 1 >>>>> B 2 1 >>>>> B 3 0 >>>>> >>>>> Saludos, >>>>> >>>>> Manuel >>>>> >>>>> >>>>> -- >>>>> *Manuel Spínola, Ph.D.* >>>>> >>>>> Instituto Internacional en Conservación y Manejo de Vida Silvestre >>>>> Universidad Nacional >>>>> Apartado 1350-3000 >>>>> Heredia >>>>> COSTA RICA >>>>> mspinola@una.ac.cr >>>>> mspinola10@gmail.com >>>>> Teléfono: (506) 2277-3598 >>>>> Fax: (506) 2237-7036 >>>>> Personal website: Lobito de río < >>>>> https://sites.google.com/site/lobitoderio/> >>>>> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >>>>> >>>>> [[alternative HTML version deleted]] >>>>> >>>>> >>>>> _______________________________________________ >>>>> R-help-es mailing list >>>>> R-help-es@r-project.org >>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>>> >>>>> >>>> >>> >>> >>> -- >>> *Manuel Spínola, Ph.D.* >>> Instituto Internacional en Conservación y Manejo de Vida Silvestre >>> Universidad Nacional >>> Apartado 1350-3000 >>> Heredia >>> COSTA RICA >>> mspinola@una.ac.cr >>> mspinola10@gmail.com >>> Teléfono: (506) 2277-3598 >>> Fax: (506) 2237-7036 >>> Personal website: Lobito de río<https://sites.google.com/site/lobitoderio/> >>> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >>> >> >> > > > -- > *Manuel Spínola, Ph.D.* > Instituto Internacional en Conservación y Manejo de Vida Silvestre > Universidad Nacional > Apartado 1350-3000 > Heredia > COSTA RICA > mspinola@una.ac.cr > mspinola10@gmail.com > Teléfono: (506) 2277-3598 > Fax: (506) 2237-7036 > Personal website: Lobito de río<https://sites.google.com/site/lobitoderio/> > Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >[[alternative HTML version deleted]]
Manuel Spínola
2012-Jul-04 00:33 UTC
[R-es] Obtener 1 y 0 de columnas pero agrupado por otras columnas
Muchas gracias por tu paciencia Jorge. Ahora si entendí. Manuel El 3 de julio de 2012 12:06, Jorge I Velez <jorgeivanvelez@gmail.com>escribió:> Hola Manuel, > > No te preocupes. > > La funcion en este caso es > > f <- function(x) sum(unique(x), na.rm = TRUE) > > de tal forma que > > with(d, aggregate(col1, list(especie = especie, sitio = sitio), f)) > > deberia darte el mismo resultado que antes. > > En la sintaxis de aggregate() el argumento FUN = ... corresponde a la > funcion que debe aplicarse (ver ?aggregate para mas informacion), pero esa > funcion puede ser creada explicitamente (como acabo de hacerlo al definir > f) o implicitamente (como en mi respuesta anterior). Esto ultimo tambien > es conocido como "on the fly". > > Espero que ahora todo tenga mas sentido ;-) > > Jorge.- > > > 2012/7/3 Manuel Spínola <> > >> Muchas gracias Jorge. >> >> Lamentablemente todavía no lo entiendo. ¿Entonces debo escribir una >> función y luego sum(unique(x, na.rm = TRUE))? >> >> Saludos. >> >> Manuel >> >> El 3 de julio de 2012 10:15, Jorge I Velez <> escribió: >> >> Hola Manuel, >>> >>> El argumento FUN corresponde a la funcion que debe aplicarse al vector >>> de valores x que resulta de la division (en partes) de tus datos col1 >>> cuando consideras especies y sitio. Por ejemplo, consideremos los datos >>> para la especie A en el sitio 2: >>> >>> subset(d, especie == "A" & sitio == "2") >>> especie año sitio col1 >>> 2 A 2008 2 0 >>> 8 A 2009 2 NA >>> >>> En este caso, interesa un 0 como resultado. Cuando haces la particion >>> de los datos por especie y sitio, obtienes el vector >>> >>> x <- c(0, NA) >>> >>> y al hacer unique(x) obtienes x. Ahora, sum(unique(x), na.rm = TRUE) >>> sera 0 (que es lo que necesitas). En el caso en que col1 sea por ejemplo y >>> <- c(1, 1), el resultado de unique(y) sera 1 y la suma de ese resultado >>> sera 1, que corresponde exactamente a lo que describiste en tu email a la >>> lista. En general, uso unique() para deshacerme de los valores que se >>> repiten porque solo te interesa uno de ellos, y el argumento na.rm = TRUE >>> en sum() lo utilizo para no considerar los NA. >>> >>> Espero que ahora sea un poco mas claro ;-) >>> >>> Un saludo, >>> Jorge.- >>> >>> >>> 2012/7/3 Manuel Spínola <mspinola10@gmail.com> >>> >>>> Muchas gracias a todos. >>>> >>>> Como estoy trabajando con aggregate estoy siguiendo la recomendación de >>>> Jorge. >>>> >>>> Cómo utilizo el argumento, FUN = function(x) sum(unique(x)? >>>> >>>> No me puedo dar cuenta de como usar este argumento "function(x) >>>> sum(unique(x)". >>>> >>>> Saludos, >>>> >>>> Manuel >>>> >>>> El 3 de julio de 2012 09:48, Jorge I Velez <jorgeivanvelez@gmail.com>escribió: >>>> >>>> Hola Manuel, >>>>> >>>>> Podrias intentar >>>>> >>>>> d <- structure(list(especie = structure(c(1L, 1L, 1L, 2L, 2L, 2L, >>>>> 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), >>>>> year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 2009L, >>>>> 2009L, 2009L, 2009L, 2009L, 2009L), sitio = c(1L, 2L, 3L, >>>>> 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), col1 = c(1L, 0L, 1L, >>>>> 0L, 1L, 0L, 1L, NA, 0L, 1L, 0L, 0L)), .Names = c("especie", >>>>> "año", "sitio", "col1"), class = "data.frame", row.names = c(NA, >>>>> -12L)) >>>>> r <- with(d, aggregate(col1, list(especie = especie, sitio = sitio), >>>>> FUN = function(x) sum(unique(x), na.rm = TRUE))) >>>>> r[with(r, order(especie, sitio)),] >>>>> >>>>> Un saludo, >>>>> Jorge.- >>>>> >>>>> >>>>> 2012/7/3 Manuel Spínola <> >>>>> >>>>>> Estimados miembros de la lista, >>>>>> >>>>>> La semana pasada hice una pregunta sobre como obtener la suma de >>>>>> columnas >>>>>> condicionado por otras columnas. >>>>>> >>>>>> Ahora quisiera saber como hacerlo pero para obtener datos de >>>>>> presencia (1) >>>>>> y ausencia (0) y que ignore los NA. >>>>>> >>>>>> Por ejemplo, >>>>>> >>>>>> especie año sitio col1 >>>>>> >>>>>> A 2008 1 1 >>>>>> A 2008 2 0 >>>>>> A 2008 3 1 >>>>>> B 2008 1 0 >>>>>> B 2008 2 1 >>>>>> B 2008 3 0 >>>>>> A 2009 1 1 >>>>>> A 2009 2 NA >>>>>> A 2009 3 0 >>>>>> B 2009 1 1 >>>>>> B 2009 2 0 >>>>>> B 2009 3 0 >>>>>> >>>>>> Es decir, que como resultado obtenga, en el caso de especie A y sitio >>>>>> 1, >>>>>> como para los 2 años fue 1, el resultado sea de 1, en el caso de >>>>>> especie A >>>>>> y sitio 2, como el año 2008 es 0 y el 2009 es NA, el resultado >>>>>> debería sea >>>>>> 0, en el caso de especie A y sitio 3, como el año 2008 es 1 y 2009 es >>>>>> 0, el >>>>>> resultado final debería sea 1. >>>>>> >>>>>> especie sitio col1 >>>>>> A 1 1 >>>>>> A 2 0 >>>>>> A 3 1 >>>>>> B 1 1 >>>>>> B 2 1 >>>>>> B 3 0 >>>>>> >>>>>> Saludos, >>>>>> >>>>>> Manuel >>>>>> >>>>>> >>>>>> -- >>>>>> *Manuel Spínola, Ph.D.* >>>>>> >>>>>> Instituto Internacional en Conservación y Manejo de Vida Silvestre >>>>>> Universidad Nacional >>>>>> Apartado 1350-3000 >>>>>> Heredia >>>>>> COSTA RICA >>>>>> mspinola@una.ac.cr >>>>>> mspinola10@gmail.com >>>>>> Teléfono: (506) 2277-3598 >>>>>> Fax: (506) 2237-7036 >>>>>> Personal website: Lobito de río < >>>>>> https://sites.google.com/site/lobitoderio/> >>>>>> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >>>>>> >>>>>> [[alternative HTML version deleted]] >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> R-help-es mailing list >>>>>> R-help-es@r-project.org >>>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>>>> >>>>>> >>>>> >>>> >>>> >>>> -- >>>> *Manuel Spínola, Ph.D.* >>>> Instituto Internacional en Conservación y Manejo de Vida Silvestre >>>> Universidad Nacional >>>> Apartado 1350-3000 >>>> Heredia >>>> COSTA RICA >>>> mspinola@una.ac.cr >>>> mspinola10@gmail.com >>>> Teléfono: (506) 2277-3598 >>>> Fax: (506) 2237-7036 >>>> Personal website: Lobito de río<https://sites.google.com/site/lobitoderio/> >>>> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >>>> >>> >>> >> >> >> -- >> *Manuel Spínola, Ph.D.* >> Instituto Internacional en Conservación y Manejo de Vida Silvestre >> Universidad Nacional >> Apartado 1350-3000 >> Heredia >> COSTA RICA >> mspinola@una.ac.cr >> mspinola10@gmail.com >> Teléfono: (506) 2277-3598 >> Fax: (506) 2237-7036 >> Personal website: Lobito de río<https://sites.google.com/site/lobitoderio/> >> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> >> > >-- *Manuel Spínola, Ph.D.* Instituto Internacional en Conservación y Manejo de Vida Silvestre Universidad Nacional Apartado 1350-3000 Heredia COSTA RICA mspinola@una.ac.cr mspinola10@gmail.com Teléfono: (506) 2277-3598 Fax: (506) 2237-7036 Personal website: Lobito de río <https://sites.google.com/site/lobitoderio/> Institutional website: ICOMVIS <http://www.icomvis.una.ac.cr/> [[alternative HTML version deleted]]