vapply usar language funciones funcion data como r dataframe apply

usar - Función R Apply() en columnas específicas de dataframe



r language apply data frame (4)

Quiero utilizar la función aplicar en un marco de datos, pero solo aplicar la función a las últimas 5 columnas.

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})

Esto aplica A a todas las columnas de y

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)})

Esto se aplica A solo a las columnas 4-9 de y, pero el retorno total de B elimina las primeras 3 columnas ... Todavía las quiero, simplemente no quiero que se las aplique A.

wifi[,1:3]+B

tampoco hace lo que esperaba / quería.


Como se mencionó, simplemente desea que la función de apply R estándar se apply a las columnas ( MARGIN=2 ):

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A)

O, para abreviar:

wifi[,4:9] <- apply(wifi[,4:9], 2, A)

Esto actualiza las columnas 4: 9 in situ usando la función A() . Ahora, supongamos que na.rm es un argumento para A() , que probablemente debería ser. Podemos pasar na.rm=T para eliminar los valores de NA del cálculo de la siguiente manera:

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A, na.rm=T)

Lo mismo es cierto para cualquier otro argumento que quiera pasar a su función personalizada.


Creo que lo que quieres es mapply. Puede aplicar la función a todas las columnas y luego soltar las columnas que no desea. Sin embargo, si está aplicando diferentes funciones a diferentes columnas, parece probable que lo que quiere es mutate , desde el paquete dplyr.


Usando un ejemplo data.frame y función de ejemplo (solo +1 a todos los valores)

A <- function(x) x + 1 wifi <- data.frame(replicate(9,1:4)) wifi # X1 X2 X3 X4 X5 X6 X7 X8 X9 #1 1 1 1 1 1 1 1 1 1 #2 2 2 2 2 2 2 2 2 2 #3 3 3 3 3 3 3 3 3 3 #4 4 4 4 4 4 4 4 4 4 data.frame(wifi[1:3], apply(wifi[4:9],2, A) ) #or cbind(wifi[1:3], apply(wifi[4:9],2, A) ) # X1 X2 X3 X4 X5 X6 X7 X8 X9 #1 1 1 1 2 2 2 2 2 2 #2 2 2 2 3 3 3 3 3 3 #3 3 3 3 4 4 4 4 4 4 #4 4 4 4 5 5 5 5 5 5

O incluso:

data.frame(wifi[1:3], lapply(wifi[4:9], A) ) #or cbind(wifi[1:3], lapply(wifi[4:9], A) ) # X1 X2 X3 X4 X5 X6 X7 X8 X9 #1 1 1 1 2 2 2 2 2 2 #2 2 2 2 3 3 3 3 3 3 #3 3 3 3 4 4 4 4 4 4 #4 4 4 4 5 5 5 5 5 5


lapply es probablemente una mejor opción que apply aquí, ya que aplicar primero coerces your data.frame a una matriz, lo que significa que todas las columnas deben tener el mismo tipo. Dependiendo de su contexto, esto podría tener consecuencias no deseadas.

El patrón es:

df[cols] <- lapply(df[cols], FUN)

El vector ''cols'' puede ser nombres variables o índices. Prefiero usar nombres siempre que sea posible (es robusto al reordenamiento de columna). Entonces en tu caso esto podría ser:

wifi[4:9] <- lapply(wifi[4:9], A)

Un ejemplo de uso de nombres de columna:

wifi <- data.frame(A=1:4, B=runif(4), C=5:9) wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)