simbolos - reducir reutilizar y reciclar
Funciones de reciclaje y asignación(`split<-`) (2)
Gracias al comentario, la respuesta está en split<-.default
Solo para explicar su comportamiento, aquí llamo a la split<-.default
con el resultado de mi llamada en la pregunta
`split<-.default` <- function(dat, f,value = lapply(split(dat, f), max))
{
ix <- split(seq_along(dat), f, drop = drop, ...) ## the call of split here!!
n <- length(value)
j <- 0
for (i in ix) {
j <- j %% n + 1
x[i] <- value[[j]] ## here we assign the result of the first split
}
x
}
¿Puede alguien explicarme cómo funciona esta línea de código R?
split(dat, f) <- lapply(split(dat, f), max)
Pensé que es solo una regla de reciclaje pero realmente no puedo entenderlo.
Ejemplo de datos:
dat <- c(1, 2, 3, 100, 200, 300)
f <- as.factor(c("a", "a", "b", "a", "b", "b"))
split(dat, f) <- lapply(split(dat, f), max)
dat
[1] 100 100 300 100 300 300
¿El código hace lo que quiero hacer (asignar el máximo por grupo) pero la pregunta es cómo se hace esto?
La división da los valores dat[c(1,2,4)]
y dat[c(3,5,6)]
del vector.
La asignación es equivalente a dat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300
dat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300
y aquí es donde tiene lugar el reciclaje.
Editado
En cuanto a lo que sucede y por qué resulta una asignación de vectores, consulte la página 21 del manual de definición de idioma (http://cran.r-project.org/doc/manuals/R-lang.pdf). La llamada:
split(def, f) <- Z
Se interpreta como:
‘*tmp*‘ <- def
def <- "split<-"(‘*tmp*‘, f, value=Z)
rm(‘*tmp*‘)
Tenga en cuenta que split<-.default
devuelve el vector modificado.