Saludos a todos Quisiera saber si alguno conoce alguna funcion en R para contar las categorias distintas que existen en una columna de un data.frame, por ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), la cantidad de categorias distintas de la columna "clase" seria 2 y para la columna "orden" seria 3: Clase Orden A a A b B c B c Agradesco de antemano su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 [[alternative HTML version deleted]]
Gabriel, Creo que esto es lo que pides aunque ha salido algo confuso. dat <- data.frame(Clase =c("A", "B","A","A","A","B"),Orden =c("a","a","c","c","b","a")) nlevels(as.factor(dat$Clase)[1]) nlevels(as.factor(dat$Orden)[1])> nlevels(as.factor(dat$Clase)[1])[1] 2> nlevels(as.factor(dat$Orden)[1])[1] 3 Un saludo El 1 de diciembre de 2012 06:07, Gabriel Trujillo Paucar < gabriel_enter@hotmail.com> escribió:> > Saludos a todos > Quisiera saber si alguno conoce alguna funcion en R para contar las > categorias distintas que existen en una columna de un data.frame, por > ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), > la cantidad de categorias distintas de la columna "clase" seria 2 y para la > columna "orden" seria 3: > > > > Clase > Orden > > > A > a > > > A > b > > > B > c > > > B > c > > Agradesco de antemano su ayuda > > > > Gabriel Antonio Trujillo Paucar > Estudiante de Biologia > 997603768 > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Jose Luis [[alternative HTML version deleted]]
Hola, De otra manera:> datClase Orden 1 A a 2 B a 3 A c 4 A c 5 A b 6 B a> *length(unique(dat$Clase))*[1] 2> *length(unique(dat$Orden))*[1] 3 Saludos, Carlos Ortega www.qualityexcellence.es El 1 de diciembre de 2012 06:07, Gabriel Trujillo Paucar < gabriel_enter@hotmail.com> escribió:> > Saludos a todos > Quisiera saber si alguno conoce alguna funcion en R para contar las > categorias distintas que existen en una columna de un data.frame, por > ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), > la cantidad de categorias distintas de la columna "clase" seria 2 y para la > columna "orden" seria 3: > > > > Clase > Orden > > > A > a > > > A > b > > > B > c > > > B > c > > Agradesco de antemano su ayuda > > > > Gabriel Antonio Trujillo Paucar > Estudiante de Biologia > 997603768 > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Gracias por la ayuda, me salio perfecto. Tengo una duda mas, quisiera saber como eliminar toda una fila cuyo valor de su ultima columna es 0. Por ejemplo tengo la siguiente matriz: Clase Orden Prueba A a14 A a 0 B a 0 B b 17 A c 18 Algunos valores en la columna "Prueba" son 0, quisiera eliminar toda esa fila y que quede de la siguiente forma: Clase Orden Prueba A a 14 B b 17 A c 18 Agradesco de antamano por su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 Date: Sat, 1 Dec 2012 10:57:33 +0100 Subject: Re: [R-es] Saludos!!! From: cof@qualityexcellence.es To: gabriel_enter@hotmail.com CC: r-help-es@r-project.org Hola, De otra manera:> dat Clase Orden1 A a2 B a3 A c4 A c5 A b6 B a> length(unique(dat$Clase))[1] 2> length(unique(dat$Orden))[1] 3 Saludos,Carlos Ortega www.qualityexcellence.es El 1 de diciembre de 2012 06:07, Gabriel Trujillo Paucar <gabriel_enter@hotmail.com> escribió: Saludos a todos Quisiera saber si alguno conoce alguna funcion en R para contar las categorias distintas que existen en una columna de un data.frame, por ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), la cantidad de categorias distintas de la columna "clase" seria 2 y para la columna "orden" seria 3: Clase Orden A a A b B c B c Agradesco de antemano su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es -- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Gabriel ¿Porque no escribís un data.frame? Es más fácil para nosotros leerlo en menos de un segundo y en cinco segundos escribimos sobre este la respuesta en código R. Tu problema se entiende, pero si lo expresas en R aprendes más rápido y nosotros estamos menos tiempo para responderte. Javier Marcuzzi -----Mensaje original----- From: Gabriel Trujillo Paucar Sent: Saturday, December 01, 2012 9:31 PM To: cof en qualityexcellence.es Cc: r-help-es en r-project.org Subject: Re: [R-es] Saludos!!! Gracias por la ayuda, me salio perfecto. Tengo una duda mas, quisiera saber como eliminar toda una fila cuyo valor de su ultima columna es 0. Por ejemplo tengo la siguiente matriz: Clase Orden Prueba A a14 A a 0 B a 0 B b 17 A c 18 Algunos valores en la columna "Prueba" son 0, quisiera eliminar toda esa fila y que quede de la siguiente forma: Clase Orden Prueba A a 14 B b 17 A c 18 Agradesco de antamano por su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 Date: Sat, 1 Dec 2012 10:57:33 +0100 Subject: Re: [R-es] Saludos!!! From: cof en qualityexcellence.es To: gabriel_enter en hotmail.com CC: r-help-es en r-project.org Hola, De otra manera:> dat Clase Orden1 A a2 B a3 A c4 A c5 A b6 B a> length(unique(dat$Clase))[1] 2> length(unique(dat$Orden))[1] 3 Saludos,Carlos Ortega www.qualityexcellence.es El 1 de diciembre de 2012 06:07, Gabriel Trujillo Paucar <gabriel_enter en hotmail.com> escribió: Saludos a todos Quisiera saber si alguno conoce alguna funcion en R para contar las categorias distintas que existen en una columna de un data.frame, por ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), la cantidad de categorias distintas de la columna "clase" seria 2 y para la columna "orden" seria 3: Clase Orden A a A b B c B c Agradesco de antemano su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es -- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Hola, Así: ##################################> dat <- data.frame(+ Clase =c("A", "B","A","A","A","B") + ,Orden=c("a","a","c","c","b","a") + ,Test=c(14,7,0,0,18,20) + )> > datClase Orden Test 1 A a 14 2 B a 7 3 A c 0 4 A c 0 5 A b 18 6 B a 20> *dat.limpio <- dat[dat$Test!=0, ]* > dat.limpioClase Orden Test 1 A a 14 2 B a 7 5 A b 18 6 B a 20 ################################### Saludos, Carlos Ortega www.qualityexcellence.es El 2 de diciembre de 2012 01:31, Gabriel Trujillo Paucar < gabriel_enter@hotmail.com> escribió:> Gracias por la ayuda, me salio perfecto. > Tengo una duda mas, quisiera saber como eliminar toda una fila cuyo valor > de su ultima columna es 0. Por ejemplo tengo la siguiente matriz: > > Clase Orden Prueba A a14 A a 0 B a 0 B b 17 A c 18 > Algunos valores en la columna "Prueba" son 0, quisiera eliminar toda esa > fila y que quede de la siguiente forma: > > Clase Orden Prueba A a 14 B b 17 A c 18 > > Agradesco de antamano por su ayuda > > *Gabriel Antonio Trujillo Paucar* > *Estudiante de Biologia* > * 997603768* > > > > ------------------------------ > Date: Sat, 1 Dec 2012 10:57:33 +0100 > Subject: Re: [R-es] Saludos!!! > From: cof@qualityexcellence.es > To: gabriel_enter@hotmail.com > CC: r-help-es@r-project.org > > > Hola, > > De otra manera: > > > dat > Clase Orden > 1 A a > 2 B a > 3 A c > 4 A c > 5 A b > 6 B a > > *length(unique(dat$Clase))* > [1] 2 > > *length(unique(dat$Orden))* > [1] 3 > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > El 1 de diciembre de 2012 06:07, Gabriel Trujillo Paucar < > gabriel_enter@hotmail.com> escribió: > > > Saludos a todos > Quisiera saber si alguno conoce alguna funcion en R para contar las > categorias distintas que existen en una columna de un data.frame, por > ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), > la cantidad de categorias distintas de la columna "clase" seria 2 y para la > columna "orden" seria 3: > > > > Clase > Orden > > > A > a > > > A > b > > > B > c > > > B > c > > Agradesco de antemano su ayuda > > > > Gabriel Antonio Trujillo Paucar > Estudiante de Biologia > 997603768 > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > 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]]
Muchas gracias, me salio bien Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 Date: Sun, 2 Dec 2012 02:51:09 +0100 Subject: Re: [R-es] Saludos!!! From: cof@qualityexcellence.es To: gabriel_enter@hotmail.com CC: r-help-es@r-project.org Hola, Así: ##################################> dat <- data.frame(+ Clase =c("A", "B","A","A","A","B")+ ,Orden=c("a","a","c","c","b","a")+ ,Test=c(14,7,0,0,18,20) + )> > dat Clase Orden Test 1 A a 142 B a 73 A c 04 A c 0 5 A b 186 B a 20> dat.limpio <- dat[dat$Test!=0, ]> dat.limpio Clase Orden Test1 A a 142 B a 75 A b 186 B a 20 ################################### Saludos,Carlos Ortegawww.qualityexcellence.es El 2 de diciembre de 2012 01:31, Gabriel Trujillo Paucar <gabriel_enter@hotmail.com> escribió: Gracias por la ayuda, me salio perfecto. Tengo una duda mas, quisiera saber como eliminar toda una fila cuyo valor de su ultima columna es 0. Por ejemplo tengo la siguiente matriz: Clase Orden Prueba A a14 A a 0 B a 0 B b 17 A c 18 Algunos valores en la columna "Prueba" son 0, quisiera eliminar toda esa fila y que quede de la siguiente forma: Clase Orden Prueba A a 14 B b 17 A c 18 Agradesco de antamano por su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 Date: Sat, 1 Dec 2012 10:57:33 +0100 [[elided Hotmail spam]] From: cof@qualityexcellence.es To: gabriel_enter@hotmail.com CC: r-help-es@r-project.org Hola, De otra manera:> dat Clase Orden1 A a2 B a3 A c4 A c5 A b6 B a> length(unique(dat$Clase))[1] 2> length(unique(dat$Orden))[1] 3 Saludos,Carlos Ortega www.qualityexcellence.es El 1 de diciembre de 2012 06:07, Gabriel Trujillo Paucar <gabriel_enter@hotmail.com> escribió: Saludos a todos Quisiera saber si alguno conoce alguna funcion en R para contar las categorias distintas que existen en una columna de un data.frame, por ejemplo si tuviera dos columnas (una llamada clase y otra llamada orden), la cantidad de categorias distintas de la columna "clase" seria 2 y para la columna "orden" seria 3: Clase Orden A a A b B c B c Agradesco de antemano su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list R-help-es@r-project.org 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]]
Saludos a todos!!! Estoy creando una funcion que al final me bote una lista de 4 elementos, pero que solo muestre 3 de ellos parecido a la siguiente funcion ya creada en R ###########################################>library(vegan) >data(BCI) >specaccum(BCI,method="random")Species Accumulation Curve Accumulation method: exact Call: specaccum(comm = BCI) Sites 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 Richness 90.780000 121.609796 139.045867 150.711568 159.236344 165.830621 sd 6.934811 7.193362 7.001993 6.635769 6.248117 5.894738 Sites 7.00000 8.000000 9.000000 10.000000 11.000000 12.000000 Richness 171.14214 175.553185 179.305613 182.560444 185.429166 187.991422 sd 5.59124 5.337029 5.125867 4.950143 4.802556 4.676742 Sites 13.000000 14.000000 15.000000 16.000000 17.000000 18.000000 Richness 190.305605 192.415490 194.354543 196.148792 197.818788 199.380984 sd 4.567412 4.470298 4.382021 4.299949 4.222057 4.146805 Sites 19.000000 20.000000 21.000000 22.000000 23.000000 24.000000 Richness 200.848707 202.232871 203.542501 204.785122 205.967066 207.093696 sd 4.073037 3.999894 3.926745 3.853133 3.778725 3.703284 Sites 25.000000 26.000000 27.000000 28.000000 29.000000 30.000000 Richness 208.169590 209.198683 210.184380 211.129646 212.037082 212.908981 sd 3.626634 3.548645 3.469209 3.388235 3.305631 3.221301 Sites 31.000000 32.000000 33.000000 34.000000 35.000000 36.00000 Richness 213.747382 214.554104 215.330782 216.078894 216.799782 217.49467 sd 3.135138 3.047015 2.956781 2.864256 2.769223 2.67142 Sites 37.00000 38.000000 39.000000 40.000000 41.000000 42.000000 Richness 218.16469 218.810871 219.434176 220.035497 220.615665 221.175459 sd 2.57053 2.466167 2.357857 2.245008 2.126874 2.002491 Sites 43.000000 44.000000 45.000000 46.000000 47.000000 48.0000000 Richness 221.715608 222.236800 222.739685 223.224876 223.692959 224.1444898 sd 1.870578 1.729378 1.576348 1.407647 1.216392 0.9916025 Sites 49.0000000 50 Richness 224.5800000 225 sd 0.6954135 0 Warning message: In cor(x > 0) : the standard deviation is zero ##################################################### ###### Como se oberva el resultado bota valores de sites, richness y sd "alineados" uno con el ######otro a cual ####corresponde. Si ponen la estructura de este objeto tendran #####################################################>str(specaccum(BCI,method="random"))List of 6 $ call : language specaccum(comm = BCI, method = "random") $ method : chr "random" $ sites : int [1:50] 1 2 3 4 5 6 7 8 9 10 ... $ richness: num [1:50] 91 121 139 151 159 ... $ sd : num [1:50] 6.73 7.02 6.65 6.23 5.14 ... $ perm : num [1:50, 1:100] 94 129 141 156 161 168 173 177 178 181 ... - attr(*, "class")= chr "specaccum" ################################################### ###### Ese objeto resultante es una lista de 6 elementos, sin embargo cuando lo colocas como resultado no muestra $perm como se observa cuando corres la funcion "specaccum", solo muestra call, method, sites, richnness, sd. Asi es como me gustaria poder hacer para mi funcion, y ademas para que los valores de sites, richnness y sd salgan alineados uno con el otro. Me gustaria que tipo de saber que tipo de comando podria usar para que cuando corra la funcion creada no muestre "$perm" y los otro valores salgan alineados. He revisado el cuerpo de la funcion specaccum y la he puesto parecida a la mia y no he visto diferencias, tampoco he encontrado algun comando que le ordene a funcion ocultar el $perm ################################################### Agradezco de antemano su ayuda Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768 [[alternative HTML version deleted]]
Hola Gabriel, La solución sería que la función devuelva la lista con la función invisible(), en vez de return(). De esta forma, no se muestra nada en la salida. Justo antes de esta línea en la función, utiliza el método que quieras para mostrar los elementos de la lista (por ejemplo, print(), show(), ...) sobre cada uno de ellos. Saludos, Emilio El día 5 de diciembre de 2012 18:31, Gabriel Trujillo Paucar <gabriel_enter en hotmail.com> escribió:> > Saludos a todos!!! > > Estoy creando una funcion que al final me bote una lista de 4 elementos, pero que solo muestre 3 de ellos parecido a la siguiente funcion ya creada en R > > ########################################### > >>library(vegan) >>data(BCI) >>specaccum(BCI,method="random") > > Species Accumulation Curve > Accumulation method: exact > Call: specaccum(comm = BCI) > > Sites 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 > Richness 90.780000 121.609796 139.045867 150.711568 159.236344 165.830621 > sd 6.934811 7.193362 7.001993 6.635769 6.248117 5.894738 > > Sites 7.00000 8.000000 9.000000 10.000000 11.000000 12.000000 > Richness 171.14214 175.553185 179.305613 182.560444 185.429166 187.991422 > sd 5.59124 5.337029 5.125867 4.950143 4.802556 4.676742 > > Sites 13.000000 14.000000 15.000000 16.000000 17.000000 18.000000 > Richness 190.305605 192.415490 194.354543 196.148792 197.818788 199.380984 > sd 4.567412 4.470298 4.382021 4.299949 4.222057 4.146805 > > Sites 19.000000 20.000000 21.000000 22.000000 23.000000 24.000000 > Richness 200.848707 202.232871 203.542501 204.785122 205.967066 207.093696 > sd 4.073037 3.999894 3.926745 3.853133 3.778725 3.703284 > > Sites 25.000000 26.000000 27.000000 28.000000 29.000000 30.000000 > Richness 208.169590 209.198683 210.184380 211.129646 212.037082 212.908981 > sd 3.626634 3.548645 3.469209 3.388235 3.305631 3.221301 > > Sites 31.000000 32.000000 33.000000 34.000000 35.000000 36.00000 > Richness 213.747382 214.554104 215.330782 216.078894 216.799782 217.49467 > sd 3.135138 3.047015 2.956781 2.864256 2.769223 2.67142 > > Sites 37.00000 38.000000 39.000000 40.000000 41.000000 42.000000 > Richness 218.16469 218.810871 219.434176 220.035497 220.615665 221.175459 > sd 2.57053 2.466167 2.357857 2.245008 2.126874 2.002491 > > Sites 43.000000 44.000000 45.000000 46.000000 47.000000 48.0000000 > Richness 221.715608 222.236800 222.739685 223.224876 223.692959 224.1444898 > sd 1.870578 1.729378 1.576348 1.407647 1.216392 0.9916025 > > Sites 49.0000000 50 > Richness 224.5800000 225 > sd 0.6954135 0 > Warning message: > In cor(x > 0) : the standard deviation is zero > > ##################################################### > ###### Como se oberva el resultado bota valores de sites, richness y sd "alineados" uno con el ######otro a cual ####corresponde. Si ponen la estructura de este objeto tendran > ##################################################### > >>str(specaccum(BCI,method="random")) > > List of 6 > $ call : language specaccum(comm = BCI, method = "random") > $ method : chr "random" > $ sites : int [1:50] 1 2 3 4 5 6 7 8 9 10 ... > $ richness: num [1:50] 91 121 139 151 159 ... > $ sd : num [1:50] 6.73 7.02 6.65 6.23 5.14 ... > $ perm : num [1:50, 1:100] 94 129 141 156 161 168 173 177 178 181 ... > - attr(*, "class")= chr "specaccum" > > ################################################### > ###### Ese objeto resultante es una lista de 6 elementos, sin embargo cuando lo colocas como resultado no muestra $perm como se observa cuando corres la funcion "specaccum", solo muestra call, method, sites, richnness, sd. Asi es como me gustaria poder hacer para mi funcion, y ademas para que los valores de sites, richnness y sd salgan alineados uno con el otro. Me gustaria que tipo de saber que tipo de comando podria usar para que cuando corra la funcion creada no muestre "$perm" y los otro valores salgan alineados. He revisado el cuerpo de la funcion specaccum y la he puesto parecida a la mia y no he visto diferencias, tampoco he encontrado algun comando que le ordene a funcion ocultar el $perm > > ################################################### > > Agradezco de antemano su ayuda > > Gabriel Antonio Trujillo Paucar > Estudiante de Biologia > 997603768 > > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es-- _____________________________________ Emilio L. Cano http://www.proyectum.es +34 665 676 225 Department of Statistics and Operations Research Universidad Rey Juan Carlos
Gracias por responder Daniel, Emilio!!!!! He probado con la funcion invisible, pero no me resulta. Mi lista resultante de mi funcion sale asi: ################################### $sites [1] 1 2 3 4 $mean [1] 60.26818 64.40346 65.99976 66.25882 $sd [1] 7.0176634 0.9166756 1.0994990 0.0000000 $perm [,1] [,2] [,3] [,4] [1,] 48.48485 63.24111 64.83131 66.25882 [2,] 48.48485 67.24638 67.25641 66.25882 [3,] 65.45455 63.24111 64.83131 66.25882 [4,] 64.50000 64.70899 64.83131 66.25882 [5,] 65.45455 67.24638 67.25641 66.25882 [6,] 65.45455 64.66403 66.89076 66.25882 [7,] 48.48485 67.24638 66.89076 66.25882 [8,] 48.48485 64.70899 67.25641 66.25882 [9,] 48.48485 63.24111 64.83131 66.25882 [10,] 64.50000 63.01994 64.12955 66.25882 attr(,"class") [1] "taxon.accu" ############# y su estructura es la siguiente List of 4 $ sites: int [1:4] 1 2 3 4 $ mean : num [1:4] 63.6 64.8 65.7 66.3 $ sd : num [1:4] 7.07 1.31 1.27 0 $ perm : num [1:10, 1:4] 48.5 65.5 48.5 48.5 65.5 ... - attr(*, "class")= chr "taxon.accu" ###### a diferencia de la funcion "specaccum" cuyo resultado te da Species Accumulation Curve Accumulation method: exact Call: specaccum(comm = data.3) Sites 1.0000000 2.0000000 3.0 4 Richness 3.0000000 4.0000000 4.5 5 sd 0.7071068 0.5773503 0.5 0 Warning message: In cor(x > 0) : the standard deviation is zero ####### y su estructura es List of 6 $ call : language specaccum(comm = data.3) $ method : chr "exact" $ sites : int [1:4] 1 2 3 4 $ richness: num [1:4] 3 4 4.5 5 $ sd : num [1:4] 0.707 0.577 0.5 0 $ perm : NULL - attr(*, "class")= chr "specaccum" Warning message: In cor(x > 0) : the standard deviation is zero ###### quiero que el resultado de mi funcion me de una lista similar a la de specaccum con sites richness, sd acomodados asi como se oberva arriba (uno debajo del otro sin estar separados por $ y con sus [1] como figura en el mio y tambien que no aparesca $perm en el resultado ######## #### El cuerpo de la funcion "specaccum" es la que sigue, pero no he encontrado algun comando que permite hacer estos acomodos, casi al final introduce la funcion "list" pero sin ningun cambio mas, observen (lo he sombreado con negrita) ######## { x <- comm x <- as.matrix(x) x <- x[, colSums(x) > 0, drop = FALSE] n <- nrow(x) p <- ncol(x) if (p == 1) { x <- t(x) n <- nrow(x) p <- ncol(x) } accumulator <- function(x, ind) { rowSums(apply(x[ind, ], 2, cumsum) > 0) } METHODS <- c("collector", "random", "exact", "rarefaction", "coleman") method <- match.arg(method, METHODS) specaccum <- sdaccum <- sites <- perm <- NULL if (n == 1 && method != "rarefaction") message("No actual accumulation since only 1 site provided") switch(method, collector = { sites <- 1:n specaccum <- accumulator(x, sites) }, random = { perm <- array(dim = c(n, permutations)) for (i in 1:permutations) { perm[, i] <- accumulator(x, sample(n)) } sites <- 1:n specaccum <- apply(perm, 1, mean) sdaccum <- apply(perm, 1, sd) }, exact = { freq <- colSums(x > 0) freq <- freq[freq > 0] f <- length(freq) ldiv <- lchoose(n, 1:n) result <- array(dim = c(n, f)) for (i in 1:n) { result[i, ] <- ifelse(n - freq < i, 0, exp(lchoose(n - freq, i) - ldiv[i])) } sites <- 1:n specaccum <- rowSums(1 - result) if (conditioned) { V <- result * (1 - result) tmp1 <- cor(x > 0) ind <- lower.tri(tmp1) tmp1 <- tmp1[ind] tmp1[is.na(tmp1)] <- 0 cv <- numeric(n) for (i in 1:n) { tmp2 <- outer(sqrt(V[i, ]), sqrt(V[i, ]))[ind] cv[i] <- 2 * sum(tmp1 * tmp2) } V <- rowSums(V) sdaccum <- sqrt(V + cv) } else { Stot <- specpool(x)[, gamma] sdaccum1 <- rowSums((1 - result)^2) sdaccum2 <- specaccum^2/Stot sdaccum <- sqrt(sdaccum1 - sdaccum2) } }, rarefaction = { freq <- colSums(x) freq <- freq[freq > 0] tot <- sum(freq) ind <- round(seq(tot/n, tot, length = n)) result <- matrix(NA, nrow = 2, ncol = n) for (i in 1:n) { result[, i] <- rarefy(t(freq), ind[i], se = TRUE) } specaccum <- result[1, ] sdaccum <- result[2, ] sites <- ind/tot * n }, coleman = { freq <- colSums(x > 0) result <- array(dim = c(n, p)) for (i in 1:n) { result[i, ] <- (1 - i/n)^freq } result <- 1 - result sites <- 1:n specaccum <- apply(result, 1, sum) sdaccum <- sqrt(apply(result * (1 - result), 1, sum)) }) out <- list(call = match.call(), method = method, sites = sites, richness = specaccum, sd = sdaccum, perm = perm) if (method == "rarefaction") out$individuals <- ind class(out) <- "specaccum" out } ########## Agradezco de antemano su ayuda ##### Gabriel Antonio Trujillo Paucar Estudiante de Biologia 997603768> Date: Wed, 5 Dec 2012 15:56:29 -0300[[elided Hotmail spam]]> From: daniel319@gmail.com > To: gabriel_enter@hotmail.com > > ¿Te has fijado si hay una función para el print de specaccum en el paquete? > > Daniel Merino > > > El día 5 de diciembre de 2012 14:31, Gabriel Trujillo Paucar > <gabriel_enter@hotmail.com> escribió: > >[[elided Hotmail spam]]> > > > Estoy creando una funcion que al final me bote una lista de 4 elementos, pero que solo muestre 3 de ellos parecido a la siguiente funcion ya creada en R > > > > ########################################### > > > >>library(vegan) > >>data(BCI) > >>specaccum(BCI,method="random") > > > > Species Accumulation Curve > > Accumulation method: exact > > Call: specaccum(comm = BCI) > > > > Sites 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 > > Richness 90.780000 121.609796 139.045867 150.711568 159.236344 165.8306 > > sd 6.934811 7.193362 7.001993 6.635769 6.248117 5.894738 > > > > Sites 7.00000 8.000000 9.000000 10.000000 11.000000 12.000000 > > Richness 171.14214 175.553185 179.305613 182.560444 185.429166 187.9914 > > sd 5.59124 5.337029 5.125867 4.950143 4.802556 4.676742 > > > > Sites 13.000000 14.000000 15.000000 16.000000 17.000000 18.000000 > > Richness 190.305605 192.415490 194.354543 196.148792 197.818788 199.380 > > sd 4.567412 4.470298 4.382021 4.299949 4.222057 4.146805 > > > > Sites 19.000000 20.000000 21.000000 22.000000 23.000000 24.000000 > > Richness 200.848707 202.232871 203.542501 204.785122 205.967066 207.093 > > sd 4.073037 3.999894 3.926745 3.853133 3.778725 3.703284 > > > > Sites 25.000000 26.000000 27.000000 28.000000 29.000000 30.000000 > > Richness 208.169590 209.198683 210.184380 211.129646 212.037082 212.908 > > sd 3.626634 3.548645 3.469209 3.388235 3.305631 3.221301 > > > > Sites 31.000000 32.000000 33.000000 34.000000 35.000000 36.00000 > > Richness 213.747382 214.554104 215.330782 216.078894 216.799782 217.494 > > sd 3.135138 3.047015 2.956781 2.864256 2.769223 2.67142 > > > > Sites 37.00000 38.000000 39.000000 40.000000 41.000000 42.000000 > > Richness 218.16469 218.810871 219.434176 220.035497 220.615665 221.1754 > > sd 2.57053 2.466167 2.357857 2.245008 2.126874 2.002491 > > > > Sites 43.000000 44.000000 45.000000 46.000000 47.000000 48.0000000 > > Richness 221.715608 222.236800 222.739685 223.224876 223.692959 224.144 > > sd 1.870578 1.729378 1.576348 1.407647 1.216392 0.9916025 > > > > Sites 49.0000000 50 > > Richness 224.5800000 225 > > sd 0.6954135 0 > > Warning message: > > In cor(x > 0) : the standard deviation is zero > > > > ##################################################### > > ###### Como se oberva el resultado bota valores de sites, richness y sd "alineados" uno con el ######otro a cual ####corresponde. Si ponen la estructura de este objeto tendran > > ##################################################### > > > >>str(specaccum(BCI,method="random")) > > > > List of 6 > > $ call : language specaccum(comm = BCI, method = "random") > > $ method : chr "random" > > $ sites : int [1:50] 1 2 3 4 5 6 7 8 9 10 ... > > $ richness: num [1:50] 91 121 139 151 159 ... > > $ sd : num [1:50] 6.73 7.02 6.65 6.23 5.14 ... > > $ perm : num [1:50, 1:100] 94 129 141 156 161 168 173 177 178 181 ... > > - attr(*, "class")= chr "specaccum" > > > > ################################################### > > ###### Ese objeto resultante es una lista de 6 elementos, sin embargo cuando lo colocas como resultado no muestra $perm como se observa cuando corres la funcion "specaccum", solo muestra call, method, sites, richnness, sd. Asi es como me gustaria poder hacer para mi funcion, y ademas para que los valores de sites, richnness y sd salgan alineados uno con el otro. Me gustaria que tipo de saber que tipo de comando podria usar para que cuando corra la funcion creada no muestre "$perm" y los otro valores salgan alineados. He revisado el cuerpo de la funcion specaccum y la he puesto parecida a la mia y no he visto diferencias, tampoco he encontrado algun comando que le ordene a funcion ocultar el $perm > > > > ################################################### > > > > Agradezco de antemano su ayuda > > > > Gabriel Antonio Trujillo Paucar > > Estudiante de Biologia > > 997603768 > > > > > > [[alternative HTML version deleted]] > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > -- > Daniel[[alternative HTML version deleted]]
La función print.specaccum me parece hace lo que Emilio sugería que agregaras al final de tu función. "print.specaccum" <- function(x, ...) { cat("Species Accumulation Curve\n") cat("Accumulation method:", x$method) if (x$method == "random") { cat(", with ", ncol(x$perm), " permutations", sep="") } cat("\n") cat("Call:", deparse(x$call), "\n\n") mat <- rbind(Sites = x$sites, Richness = x$richness, sd=x$sd) colnames(mat) <- rep("", ncol(mat)) print(mat) invisible(x) } No se me ocurre otra cosa, o lo agregas al final de tu función o respetando la class creas tu propia print.xxx (nunca lo hice). Daniel Merino El día 5 de diciembre de 2012 16:57, Gabriel Trujillo Paucar <gabriel_enter en hotmail.com> escribió:> Gracias por responder Daniel, Emilio!!!!! > > He probado con la funcion invisible, pero no me resulta. Mi lista resultante > de mi funcion sale asi: > > ################################### > > $sites > [1] 1 2 3 4 > $mean > [1] 60.26818 64.40346 65.99976 66.25882 > $sd > [1] 7.0176634 0.9166756 1.0994990 0.0000000 > $perm > [,1] [,2] [,3] [,4] > [1,] 48.48485 63.24111 64.83131 66.25882 > [2,] 48.48485 67.24638 67.25641 66.25882 > [3,] 65.45455 63.24111 64.83131 66.25882 > [4,] 64.50000 64.70899 64.83131 66.25882 > [5,] 65.45455 67.24638 67.25641 66.25882 > [6,] 65.45455 64.66403 66.89076 66.25882 > [7,] 48.48485 67.24638 66.89076 66.25882 > [8,] 48.48485 64.70899 67.25641 66.25882 > [9,] 48.48485 63.24111 64.83131 66.25882 > [10,] 64.50000 63.01994 64.12955 66.25882 > attr(,"class") > [1] "taxon.accu" > > ############# y su estructura es la siguiente > > List of 4 > $ sites: int [1:4] 1 2 3 4 > $ mean : num [1:4] 63.6 64.8 65.7 66.3 > $ sd : num [1:4] 7.07 1.31 1.27 0 > $ perm : num [1:10, 1:4] 48.5 65.5 48.5 48.5 65.5 ... > - attr(*, "class")= chr "taxon.accu" > > ###### a diferencia de la funcion "specaccum" cuyo resultado te da > > Species Accumulation Curve > Accumulation method: exact > Call: specaccum(comm = data.3) > > Sites 1.0000000 2.0000000 3.0 4 > Richness 3.0000000 4.0000000 4.5 5 > sd 0.7071068 0.5773503 0.5 0 > > Warning message: > In cor(x > 0) : the standard deviation is zero > > ####### y su estructura es > > List of 6 > $ call : language specaccum(comm = data.3) > $ method : chr "exact" > $ sites : int [1:4] 1 2 3 4 > $ richness: num [1:4] 3 4 4.5 5 > $ sd : num [1:4] 0.707 0.577 0.5 0 > $ perm : NULL > > - attr(*, "class")= chr "specaccum" > Warning message: > In cor(x > 0) : the standard deviation is zero > > ###### quiero que el resultado de mi funcion me de una lista similar a la de > specaccum con sites richness, sd acomodados asi como se oberva arriba (uno > debajo del otro sin estar separados por $ y con sus [1] como figura en el > mio y tambien que no aparesca $perm en el resultado ######## > > #### El cuerpo de la funcion "specaccum" es la que sigue, pero no he > encontrado algun comando que permite hacer estos acomodos, casi al final > introduce la funcion "list" pero sin ningun cambio mas, observen (lo he > sombreado con negrita) ######## > > { > x <- comm > x <- as.matrix(x) > x <- x[, colSums(x) > 0, drop = FALSE] > n <- nrow(x) > p <- ncol(x) > if (p == 1) { > x <- t(x) > n <- nrow(x) > p <- ncol(x) > } > accumulator <- function(x, ind) { > rowSums(apply(x[ind, ], 2, cumsum) > 0) > } > METHODS <- c("collector", "random", "exact", "rarefaction", > "coleman") > method <- match.arg(method, METHODS) > specaccum <- sdaccum <- sites <- perm <- NULL > if (n == 1 && method != "rarefaction") > message("No actual accumulation since only 1 site provided") > switch(method, collector = { > sites <- 1:n > specaccum <- accumulator(x, sites) > }, random = { > perm <- array(dim = c(n, permutations)) > for (i in 1:permutations) { > perm[, i] <- accumulator(x, sample(n)) > } > sites <- 1:n > specaccum <- apply(perm, 1, mean) > sdaccum <- apply(perm, 1, sd) > }, exact = { > freq <- colSums(x > 0) > freq <- freq[freq > 0] > f <- length(freq) > ldiv <- lchoose(n, 1:n) > result <- array(dim = c(n, f)) > for (i in 1:n) { > result[i, ] <- ifelse(n - freq < i, 0, exp(lchoose(n - > freq, i) - ldiv[i])) > } > sites <- 1:n > specaccum <- rowSums(1 - result) > if (conditioned) { > V <- result * (1 - result) > tmp1 <- cor(x > 0) > ind <- lower.tri(tmp1) > tmp1 <- tmp1[ind] > tmp1[is.na(tmp1)] <- 0 > cv <- numeric(n) > for (i in 1:n) { > tmp2 <- outer(sqrt(V[i, ]), sqrt(V[i, ]))[ind] > cv[i] <- 2 * sum(tmp1 * tmp2) > } > V <- rowSums(V) > sdaccum <- sqrt(V + cv) > } else { > Stot <- specpool(x)[, gamma] > sdaccum1 <- rowSums((1 - result)^2) > sdaccum2 <- specaccum^2/Stot > sdaccum <- sqrt(sdaccum1 - sdaccum2) > } > }, rarefaction = { > freq <- colSums(x) > freq <- freq[freq > 0] > tot <- sum(freq) > ind <- round(seq(tot/n, tot, length = n)) > result <- matrix(NA, nrow = 2, ncol = n) > for (i in 1:n) { > result[, i] <- rarefy(t(freq), ind[i], se = TRUE) > } > specaccum <- result[1, ] > sdaccum <- result[2, ] > sites <- ind/tot * n > }, coleman = { > freq <- colSums(x > 0) > result <- array(dim = c(n, p)) > for (i in 1:n) { > result[i, ] <- (1 - i/n)^freq > } > result <- 1 - result > sites <- 1:n > specaccum <- apply(result, 1, sum) > sdaccum <- sqrt(apply(result * (1 - result), 1, sum)) > }) > out <- list(call = match.call(), method = method, sites = sites, > richness = specaccum, sd = sdaccum, perm = perm) > if (method == "rarefaction") > out$individuals <- ind > class(out) <- "specaccum" > out > } > > ########## Agradezco de antemano su ayuda ##### > > > Gabriel Antonio Trujillo Paucar > Estudiante de Biologia > 997603768 > > > >> Date: Wed, 5 Dec 2012 15:56:29 -0300 >> Subject: Re: [R-es] Saludos!!! >> From: daniel319 en gmail.com >> To: gabriel_enter en hotmail.com > >> >> ¿Te has fijado si hay una función para el print de specaccum en el >> paquete? >> >> Daniel Merino >> >> >> El día 5 de diciembre de 2012 14:31, Gabriel Trujillo Paucar >> <gabriel_enter en hotmail.com> escribió: >> > >> > Saludos a todos!!! >> > >> > Estoy creando una funcion que al final me bote una lista de 4 elementos, >> > pero que solo muestre 3 de ellos parecido a la siguiente funcion ya creada >> > en R >> > >> > ########################################### >> > >> >>library(vegan) >> >>data(BCI) >> >>specaccum(BCI,method="random") >> > >> > Species Accumulation Curve >> > Accumulation method: exact >> > Call: specaccum(comm = BCI) >> > >> > Sites 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 >> > Richness 90.780000 121.609796 139.045867 150.711568 159.236344 >> > 165.830621 >> > sd 6.934811 7.193362 7.001993 6.635769 6.248117 5.894738 >> > >> > Sites 7.00000 8.000000 9.000000 10.000000 11.000000 12.000000 >> > Richness 171.14214 175.553185 179.305613 182.560444 185.429166 >> > 187.991422 >> > sd 5.59124 5.337029 5.125867 4.950143 4.802556 4.676742 >> > >> > Sites 13.000000 14.000000 15.000000 16.000000 17.000000 18.000000 >> > Richness 190.305605 192.415490 194.354543 196.148792 197.818788 >> > 199.380984 >> > sd 4.567412 4.470298 4.382021 4.299949 4.222057 4.146805 >> > >> > Sites 19.000000 20.000000 21.000000 22.000000 23.000000 24.000000 >> > Richness 200.848707 202.232871 203.542501 204.785122 205.967066 >> > 207.093696 >> > sd 4.073037 3.999894 3.926745 3.853133 3.778725 3.703284 >> > >> > Sites 25.000000 26.000000 27.000000 28.000000 29.000000 30.000000 >> > Richness 208.169590 209.198683 210.184380 211.129646 212.037082 >> > 212.908981 >> > sd 3.626634 3.548645 3.469209 3.388235 3.305631 3.221301 >> > >> > Sites 31.000000 32.000000 33.000000 34.000000 35.000000 36.00000 >> > Richness 213.747382 214.554104 215.330782 216.078894 216.799782 >> > 217.49467 >> > sd 3.135138 3.047015 2.956781 2.864256 2.769223 2.67142 >> > >> > Sites 37.00000 38.000000 39.000000 40.000000 41.000000 42.000000 >> > Richness 218.16469 218.810871 219.434176 220.035497 220.615665 >> > 221.175459 >> > sd 2.57053 2.466167 2.357857 2.245008 2.126874 2.002491 >> > >> > Sites 43.000000 44.000000 45.000000 46.000000 47.000000 48.0000000 >> > Richness 221.715608 222.236800 222.739685 223.224876 223.692959 >> > 224.1444898 >> > sd 1.870578 1.729378 1.576348 1.407647 1.216392 0.9916025 >> > >> > Sites 49.0000000 50 >> > Richness 224.5800000 225 >> > sd 0.6954135 0 >> > Warning message: >> > In cor(x > 0) : the standard deviation is zero >> > >> > ##################################################### >> > ###### Como se oberva el resultado bota valores de sites, richness y sd >> > "alineados" uno con el ######otro a cual ####corresponde. Si ponen la >> > estructura de este objeto tendran >> > ##################################################### >> > >> >>str(specaccum(BCI,method="random")) >> > >> > List of 6 >> > $ call : language specaccum(comm = BCI, method = "random") >> > $ method : chr "random" >> > $ sites : int [1:50] 1 2 3 4 5 6 7 8 9 10 ... >> > $ richness: num [1:50] 91 121 139 151 159 ... >> > $ sd : num [1:50] 6.73 7.02 6.65 6.23 5.14 ... >> > $ perm : num [1:50, 1:100] 94 129 141 156 161 168 173 177 178 181 ... >> > - attr(*, "class")= chr "specaccum" >> > >> > ################################################### >> > ###### Ese objeto resultante es una lista de 6 elementos, sin embargo >> > cuando lo colocas como resultado no muestra $perm como se observa cuando >> > corres la funcion "specaccum", solo muestra call, method, sites, richnness, >> > sd. Asi es como me gustaria poder hacer para mi funcion, y ademas para que >> > los valores de sites, richnness y sd salgan alineados uno con el otro. Me >> > gustaria que tipo de saber que tipo de comando podria usar para que cuando >> > corra la funcion creada no muestre "$perm" y los otro valores salgan >> > alineados. He revisado el cuerpo de la funcion specaccum y la he puesto >> > parecida a la mia y no he visto diferencias, tampoco he encontrado algun >> > comando que le ordene a funcion ocultar el $perm >> > >> > ################################################### >> > >> > Agradezco de antemano su ayuda >> > >> > Gabriel Antonio Trujillo Paucar >> > Estudiante de Biologia >> > 997603768 >> > >> > >> > [[alternative HTML version deleted]] >> > >> > _______________________________________________ >> > R-help-es mailing list >> > R-help-es en r-project.org >> > https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >> >> -- >> Daniel-- Daniel
Efectivamente Gabriel, o esto es lo que buscas, o no entiendo el problema: foo <- function(){ completeList <- list(a = 1:10, b = letters[1:5], c = data.frame(y = rnorm(100), y as.factor(rep(1:4, times = 25))), d = "Please do not print") for (i in 1:(length(completeList)-2)){ cat(paste("This is list", i, ":\n")) print(completeList[[i]]) } print(summary(completeList[["c"]])) invisible(completeList) } foo() myVar <- foo() myVar Saludos, Emilio El día 5 de diciembre de 2012 22:34, daniel <daniel319 en gmail.com> escribió:> La función print.specaccum me parece hace lo que Emilio sugería que > agregaras al final de tu función. > > "print.specaccum" <- > function(x, ...) > { > cat("Species Accumulation Curve\n") > cat("Accumulation method:", x$method) > if (x$method == "random") { > cat(", with ", ncol(x$perm), " permutations", sep="") > } > cat("\n") > cat("Call:", deparse(x$call), "\n\n") > mat <- rbind(Sites = x$sites, Richness = x$richness, sd=x$sd) > colnames(mat) <- rep("", ncol(mat)) > print(mat) > invisible(x) > } > > > No se me ocurre otra cosa, o lo agregas al final de tu función o > respetando la class creas tu propia print.xxx (nunca lo hice). > > Daniel Merino > > El día 5 de diciembre de 2012 16:57, Gabriel Trujillo Paucar > <gabriel_enter en hotmail.com> escribió: >> Gracias por responder Daniel, Emilio!!!!! >> >> He probado con la funcion invisible, pero no me resulta. Mi lista resultante >> de mi funcion sale asi: >> >> ################################### >> >> $sites >> [1] 1 2 3 4 >> $mean >> [1] 60.26818 64.40346 65.99976 66.25882 >> $sd >> [1] 7.0176634 0.9166756 1.0994990 0.0000000 >> $perm >> [,1] [,2] [,3] [,4] >> [1,] 48.48485 63.24111 64.83131 66.25882 >> [2,] 48.48485 67.24638 67.25641 66.25882 >> [3,] 65.45455 63.24111 64.83131 66.25882 >> [4,] 64.50000 64.70899 64.83131 66.25882 >> [5,] 65.45455 67.24638 67.25641 66.25882 >> [6,] 65.45455 64.66403 66.89076 66.25882 >> [7,] 48.48485 67.24638 66.89076 66.25882 >> [8,] 48.48485 64.70899 67.25641 66.25882 >> [9,] 48.48485 63.24111 64.83131 66.25882 >> [10,] 64.50000 63.01994 64.12955 66.25882 >> attr(,"class") >> [1] "taxon.accu" >> >> ############# y su estructura es la siguiente >> >> List of 4 >> $ sites: int [1:4] 1 2 3 4 >> $ mean : num [1:4] 63.6 64.8 65.7 66.3 >> $ sd : num [1:4] 7.07 1.31 1.27 0 >> $ perm : num [1:10, 1:4] 48.5 65.5 48.5 48.5 65.5 ... >> - attr(*, "class")= chr "taxon.accu" >> >> ###### a diferencia de la funcion "specaccum" cuyo resultado te da >> >> Species Accumulation Curve >> Accumulation method: exact >> Call: specaccum(comm = data.3) >> >> Sites 1.0000000 2.0000000 3.0 4 >> Richness 3.0000000 4.0000000 4.5 5 >> sd 0.7071068 0.5773503 0.5 0 >> >> Warning message: >> In cor(x > 0) : the standard deviation is zero >> >> ####### y su estructura es >> >> List of 6 >> $ call : language specaccum(comm = data.3) >> $ method : chr "exact" >> $ sites : int [1:4] 1 2 3 4 >> $ richness: num [1:4] 3 4 4.5 5 >> $ sd : num [1:4] 0.707 0.577 0.5 0 >> $ perm : NULL >> >> - attr(*, "class")= chr "specaccum" >> Warning message: >> In cor(x > 0) : the standard deviation is zero >> >> ###### quiero que el resultado de mi funcion me de una lista similar a la de >> specaccum con sites richness, sd acomodados asi como se oberva arriba (uno >> debajo del otro sin estar separados por $ y con sus [1] como figura en el >> mio y tambien que no aparesca $perm en el resultado ######## >> >> #### El cuerpo de la funcion "specaccum" es la que sigue, pero no he >> encontrado algun comando que permite hacer estos acomodos, casi al final >> introduce la funcion "list" pero sin ningun cambio mas, observen (lo he >> sombreado con negrita) ######## >> >> { >> x <- comm >> x <- as.matrix(x) >> x <- x[, colSums(x) > 0, drop = FALSE] >> n <- nrow(x) >> p <- ncol(x) >> if (p == 1) { >> x <- t(x) >> n <- nrow(x) >> p <- ncol(x) >> } >> accumulator <- function(x, ind) { >> rowSums(apply(x[ind, ], 2, cumsum) > 0) >> } >> METHODS <- c("collector", "random", "exact", "rarefaction", >> "coleman") >> method <- match.arg(method, METHODS) >> specaccum <- sdaccum <- sites <- perm <- NULL >> if (n == 1 && method != "rarefaction") >> message("No actual accumulation since only 1 site provided") >> switch(method, collector = { >> sites <- 1:n >> specaccum <- accumulator(x, sites) >> }, random = { >> perm <- array(dim = c(n, permutations)) >> for (i in 1:permutations) { >> perm[, i] <- accumulator(x, sample(n)) >> } >> sites <- 1:n >> specaccum <- apply(perm, 1, mean) >> sdaccum <- apply(perm, 1, sd) >> }, exact = { >> freq <- colSums(x > 0) >> freq <- freq[freq > 0] >> f <- length(freq) >> ldiv <- lchoose(n, 1:n) >> result <- array(dim = c(n, f)) >> for (i in 1:n) { >> result[i, ] <- ifelse(n - freq < i, 0, exp(lchoose(n - >> freq, i) - ldiv[i])) >> } >> sites <- 1:n >> specaccum <- rowSums(1 - result) >> if (conditioned) { >> V <- result * (1 - result) >> tmp1 <- cor(x > 0) >> ind <- lower.tri(tmp1) >> tmp1 <- tmp1[ind] >> tmp1[is.na(tmp1)] <- 0 >> cv <- numeric(n) >> for (i in 1:n) { >> tmp2 <- outer(sqrt(V[i, ]), sqrt(V[i, ]))[ind] >> cv[i] <- 2 * sum(tmp1 * tmp2) >> } >> V <- rowSums(V) >> sdaccum <- sqrt(V + cv) >> } else { >> Stot <- specpool(x)[, gamma] >> sdaccum1 <- rowSums((1 - result)^2) >> sdaccum2 <- specaccum^2/Stot >> sdaccum <- sqrt(sdaccum1 - sdaccum2) >> } >> }, rarefaction = { >> freq <- colSums(x) >> freq <- freq[freq > 0] >> tot <- sum(freq) >> ind <- round(seq(tot/n, tot, length = n)) >> result <- matrix(NA, nrow = 2, ncol = n) >> for (i in 1:n) { >> result[, i] <- rarefy(t(freq), ind[i], se = TRUE) >> } >> specaccum <- result[1, ] >> sdaccum <- result[2, ] >> sites <- ind/tot * n >> }, coleman = { >> freq <- colSums(x > 0) >> result <- array(dim = c(n, p)) >> for (i in 1:n) { >> result[i, ] <- (1 - i/n)^freq >> } >> result <- 1 - result >> sites <- 1:n >> specaccum <- apply(result, 1, sum) >> sdaccum <- sqrt(apply(result * (1 - result), 1, sum)) >> }) >> out <- list(call = match.call(), method = method, sites = sites, >> richness = specaccum, sd = sdaccum, perm = perm) >> if (method == "rarefaction") >> out$individuals <- ind >> class(out) <- "specaccum" >> out >> } >> >> ########## Agradezco de antemano su ayuda ##### >> >> >> Gabriel Antonio Trujillo Paucar >> Estudiante de Biologia >> 997603768 >> >> >> >>> Date: Wed, 5 Dec 2012 15:56:29 -0300 >>> Subject: Re: [R-es] Saludos!!! >>> From: daniel319 en gmail.com >>> To: gabriel_enter en hotmail.com >> >>> >>> ¿Te has fijado si hay una función para el print de specaccum en el >>> paquete? >>> >>> Daniel Merino >>> >>> >>> El día 5 de diciembre de 2012 14:31, Gabriel Trujillo Paucar >>> <gabriel_enter en hotmail.com> escribió: >>> > >>> > Saludos a todos!!! >>> > >>> > Estoy creando una funcion que al final me bote una lista de 4 elementos, >>> > pero que solo muestre 3 de ellos parecido a la siguiente funcion ya creada >>> > en R >>> > >>> > ########################################### >>> > >>> >>library(vegan) >>> >>data(BCI) >>> >>specaccum(BCI,method="random") >>> > >>> > Species Accumulation Curve >>> > Accumulation method: exact >>> > Call: specaccum(comm = BCI) >>> > >>> > Sites 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 >>> > Richness 90.780000 121.609796 139.045867 150.711568 159.236344 >>> > 165.830621 >>> > sd 6.934811 7.193362 7.001993 6.635769 6.248117 5.894738 >>> > >>> > Sites 7.00000 8.000000 9.000000 10.000000 11.000000 12.000000 >>> > Richness 171.14214 175.553185 179.305613 182.560444 185.429166 >>> > 187.991422 >>> > sd 5.59124 5.337029 5.125867 4.950143 4.802556 4.676742 >>> > >>> > Sites 13.000000 14.000000 15.000000 16.000000 17.000000 18.000000 >>> > Richness 190.305605 192.415490 194.354543 196.148792 197.818788 >>> > 199.380984 >>> > sd 4.567412 4.470298 4.382021 4.299949 4.222057 4.146805 >>> > >>> > Sites 19.000000 20.000000 21.000000 22.000000 23.000000 24.000000 >>> > Richness 200.848707 202.232871 203.542501 204.785122 205.967066 >>> > 207.093696 >>> > sd 4.073037 3.999894 3.926745 3.853133 3.778725 3.703284 >>> > >>> > Sites 25.000000 26.000000 27.000000 28.000000 29.000000 30.000000 >>> > Richness 208.169590 209.198683 210.184380 211.129646 212.037082 >>> > 212.908981 >>> > sd 3.626634 3.548645 3.469209 3.388235 3.305631 3.221301 >>> > >>> > Sites 31.000000 32.000000 33.000000 34.000000 35.000000 36.00000 >>> > Richness 213.747382 214.554104 215.330782 216.078894 216.799782 >>> > 217.49467 >>> > sd 3.135138 3.047015 2.956781 2.864256 2.769223 2.67142 >>> > >>> > Sites 37.00000 38.000000 39.000000 40.000000 41.000000 42.000000 >>> > Richness 218.16469 218.810871 219.434176 220.035497 220.615665 >>> > 221.175459 >>> > sd 2.57053 2.466167 2.357857 2.245008 2.126874 2.002491 >>> > >>> > Sites 43.000000 44.000000 45.000000 46.000000 47.000000 48.0000000 >>> > Richness 221.715608 222.236800 222.739685 223.224876 223.692959 >>> > 224.1444898 >>> > sd 1.870578 1.729378 1.576348 1.407647 1.216392 0.9916025 >>> > >>> > Sites 49.0000000 50 >>> > Richness 224.5800000 225 >>> > sd 0.6954135 0 >>> > Warning message: >>> > In cor(x > 0) : the standard deviation is zero >>> > >>> > ##################################################### >>> > ###### Como se oberva el resultado bota valores de sites, richness y sd >>> > "alineados" uno con el ######otro a cual ####corresponde. Si ponen la >>> > estructura de este objeto tendran >>> > ##################################################### >>> > >>> >>str(specaccum(BCI,method="random")) >>> > >>> > List of 6 >>> > $ call : language specaccum(comm = BCI, method = "random") >>> > $ method : chr "random" >>> > $ sites : int [1:50] 1 2 3 4 5 6 7 8 9 10 ... >>> > $ richness: num [1:50] 91 121 139 151 159 ... >>> > $ sd : num [1:50] 6.73 7.02 6.65 6.23 5.14 ... >>> > $ perm : num [1:50, 1:100] 94 129 141 156 161 168 173 177 178 181 ... >>> > - attr(*, "class")= chr "specaccum" >>> > >>> > ################################################### >>> > ###### Ese objeto resultante es una lista de 6 elementos, sin embargo >>> > cuando lo colocas como resultado no muestra $perm como se observa cuando >>> > corres la funcion "specaccum", solo muestra call, method, sites, richnness, >>> > sd. Asi es como me gustaria poder hacer para mi funcion, y ademas para que >>> > los valores de sites, richnness y sd salgan alineados uno con el otro. Me >>> > gustaria que tipo de saber que tipo de comando podria usar para que cuando >>> > corra la funcion creada no muestre "$perm" y los otro valores salgan >>> > alineados. He revisado el cuerpo de la funcion specaccum y la he puesto >>> > parecida a la mia y no he visto diferencias, tampoco he encontrado algun >>> > comando que le ordene a funcion ocultar el $perm >>> > >>> > ################################################### >>> > >>> > Agradezco de antemano su ayuda >>> > >>> > Gabriel Antonio Trujillo Paucar >>> > Estudiante de Biologia >>> > 997603768 >>> > >>> > >>> > [[alternative HTML version deleted]] >>> > >>> > _______________________________________________ >>> > R-help-es mailing list >>> > R-help-es en r-project.org >>> > https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >>> >>> >>> -- >>> Daniel > > > > -- > Daniel-- _____________________________________ Emilio L. Cano http://www.proyectum.es +34 665 676 225 Department of Statistics and Operations Research Universidad Rey Juan Carlos