Emilio Torres Manzanera
2013-Apr-30 17:13 UTC
[R-es] Trabajar con un argumento opcional como escalar o vector.
Estimada Lista, Deseo aplicar una función a cada fila de un data frame con un argumento opcional. En la función orginal, el argumento opcional debería poder ser escalar o vector. Necesito definir una función 'aplicaratodasfilas' que llama a otra función 'atomica' que no admite vectores y que requiere también argumentos opcionales. Pongo un ejemplo: # Se aplica a cada fila. atomica <- function(xbegin, xend, npoints = 5, ...) { # los argumentos opcionales ... son necesarios ya que hay más funciones dentro seq(xbegin,xend,length.out = npoints) # la función seq no admite vectores } aplicaratodaslasfilas <- function(data, ...) { lapply(1:dim(data)[1], function(i,...) { atomica(xbegin=data[i,1], xend=data[i,2], ...) }, ... = ... ) } data <- data.frame(xbegin=c(1:2),xend=c(11:12)) aplicaratodaslasfilas(data=data) # FUNCIONA ## [[1]] ## [1] 1.0 3.5 6.0 8.5 11.0 ## [[2]] ## [1] 2.0 4.5 7.0 9.5 12.0 aplicaratodaslasfilas(data=data, npoints = 3) # FUNCIONA ## [[1]] ## [1] 1 6 11 ## [[2]] ## [1] 2 7 12 aplicaratodaslasfilas(data=data, npoints = c(3,5)) # NO FUNCIONA # Me gustaría obtener ## [[1]] ## [1] 1 6 11 ## [[2]] ## [1] 2.0 4.5 7.0 9.5 12.0 ¿Alguien sabría definir la función aplicaracadafila de tal forma que funcione en estos casos? aplicaratodaslasfilas(data=data) aplicaratodaslasfilas(data=data, npoints = 3) aplicaratodaslasfilas(data=data, npoints = c(3,5)) Gracias Emilio
Carlos J. Gil Bellosta
2013-Apr-30 17:44 UTC
[R-es] Trabajar con un argumento opcional como escalar o vector.
¿El vector de argumentos es igual de largo que la tabla? Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 30 de abril de 2013 19:13, Emilio Torres Manzanera <torres en uniovi.es> escribió:> > Estimada Lista, > > Deseo aplicar una función a cada fila de un data frame con un argumento opcional. > En la función orginal, el argumento opcional debería poder ser escalar o vector. > > Necesito definir una función 'aplicaratodasfilas' que llama a otra función 'atomica' que no admite vectores y que requiere también argumentos opcionales. > Pongo un ejemplo: > > > # Se aplica a cada fila. > atomica <- function(xbegin, xend, npoints = 5, ...) { # los argumentos opcionales ... son necesarios ya que hay más funciones dentro > seq(xbegin,xend,length.out = npoints) # la función seq no admite vectores > } > > > aplicaratodaslasfilas <- function(data, ...) { > lapply(1:dim(data)[1], function(i,...) { > atomica(xbegin=data[i,1], xend=data[i,2], ...) > }, ... = ... > ) > } > > data <- data.frame(xbegin=c(1:2),xend=c(11:12)) > aplicaratodaslasfilas(data=data) # FUNCIONA > ## [[1]] > ## [1] 1.0 3.5 6.0 8.5 11.0 > > ## [[2]] > ## [1] 2.0 4.5 7.0 9.5 12.0 > > aplicaratodaslasfilas(data=data, npoints = 3) # FUNCIONA > ## [[1]] > ## [1] 1 6 11 > > ## [[2]] > ## [1] 2 7 12 > > aplicaratodaslasfilas(data=data, npoints = c(3,5)) # NO FUNCIONA > # Me gustaría obtener > ## [[1]] > ## [1] 1 6 11 > > ## [[2]] > ## [1] 2.0 4.5 7.0 9.5 12.0 > > ¿Alguien sabría definir la función aplicaracadafila de tal forma que funcione en estos casos? > aplicaratodaslasfilas(data=data) > aplicaratodaslasfilas(data=data, npoints = 3) > aplicaratodaslasfilas(data=data, npoints = c(3,5)) > > Gracias > Emilio > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es