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.
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)