paquete descargar ddply r plyr

descargar - Enviando en nombre de columna a ddply desde la función



dplyr r (4)

Como dijo @David Arenburg, esta pregunta es bastante antigua. Hoy, el paquete data.table o dplyr puede darle el mismo resultado con una velocidad mucho más rápida.

Aquí está la versión data.table de la respuesta.

library(data.table) my.fun <- function(myData, MyGrouping, myColumnName) { setDT(myData)[, lapply(.SD, sum), by=MyGrouping, .SDcols=myColumnName] }

Me gustaría poder enviar un nombre de columna a una llamada que estoy realizando para ddply . Un ejemplo de llamada ddply :

ddply(myData, .(MyGrouping), summarise, count=sum(myColumnName))

Si tengo ddply envuelto dentro de otra función, ¿es posible envolver esto de modo que pueda pasar un valor arbitrario como myColumnName a la función de llamada?


Esto parece funcionar, aunque probablemente será más limpio (y más seguro) para evitar summarise en esta circunstancia y escribir su propia función anónima como lo indicó Justin.

yr <- "year" summarise(baseball, duration = max(eval(parse(text = yr))) - min(eval(parse(text = yr))))


Supongo que encontré una manera que funciona con resumir. No estoy seguro si entiendo por qué, ya que no soy un experto en tratar con entornos en R, pero aquí está la solución:

> library(plyr) > > > > ########################### > # Creating test DataFrame # > ########################### > > x <- 1:15 > > set.seed(1) > y <- letters[1:3][sample(1:3, 15, replace = T)] > > df <- data.frame(x, y) > > ### check df > df x y 1 1 a 2 2 b 3 3 b 4 4 c 5 5 a 6 6 c 7 7 c 8 8 b 9 9 b 10 10 a 11 11 a 12 12 a 13 13 c 14 14 b 15 15 c > > > ##################### > # auxiliar function # > ##################### > evalString <- function(s) { + eval(parse(text = s), parent.frame()) + } > > > ### columnName input > columnName <- ''x'' > > ### call with columnName as input > xMeans <- ddply(df, + ''y'', + summarise, + mean = mean(evalString(columnName))) > > > ### regular call to ddply > xMeans2 <- ddply(df, + ''y'', + summarise, + mean = mean(x)) > > > ### Compare Results > xMeans y mean 1 a 7.8 2 b 7.2 3 c 9.0 > xMeans2 y mean 1 a 7.8 2 b 7.2 3 c 9.0 >

EDITAR: Puede usar la función get del paquete base, como se sugiere aquí: ddply: ¿cómo paso los nombres de columna como parámetros?

> xMeans3 <- ddply(df, + ''y'', + summarise, + mean = mean(get(columnName))) > > xMeans3 y mean 1 a 7.8 2 b 7.2 3 c 9.0


Tiene que haber una mejor manera. Y no pude averiguar cómo hacer que funcione con el resumen.

my.fun <- function(df, count.column) { ddply(df, .(x), function(d) sum(d[[count.column]])) } dat <- data.frame(x=letters[1:2], y=1:10) > my.fun(dat, ''y'') x V1 1 a 25 2 b 30 >