Mirando a través de la función de ave
, he encontrado una línea notable:asignación al resultado de una función de cambios de variables
split(x, g) <- lapply(split(x, g), FUN) # From ave
Curiosamente, esta línea cambia el valor de x
, que encontré inesperado. Esperaba que split(x,g)
daría como resultado una lista, que podría asignarse, pero descartarse después. Mi pregunta es, ¿por qué cambia el valor de x
?
Otro ejemplo puede explicar mejor:
a <- data.frame(id=c(1,1,2,2), value=c(4,5,7,6))
# id value
# 1 1 4
# 2 1 5
# 3 2 7
# 4 2 6
split(a,a$id) # Split a row-wise by id into a list of size 2
# $`1`
# id value
# 1 1 4
# 2 1 5
# $`2`
# id value
# 3 2 7
# 4 2 6
# Find the row with highest value for each id
lapply(split(a,a$id),function(x) x[which.max(x$value),])
# $`1`
# id value
# 2 1 5
# $`2`
# id value
# 3 2 7
# Assigning to the split changes the data.frame a!
split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])
a
# id value
# 1 1 5
# 2 1 5
# 3 2 7
# 4 2 7
no sólo ha cambiado a
, pero cambiado a un valor que no se ve como el lado derecho de la asignación! Incluso si la asignación a split(a,a$id)
cambia de alguna manera a
(que no entiendo), ¿por qué resulta en data.frame
en lugar de list
?
Tenga en cuenta que entiendo que hay mejores formas de llevar a cabo esta tarea. Mi pregunta es ¿por qué split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])
cambia a
?
La función a la que llamas es 'split <-', no' split'. Son dos funciones diferentes. Mire 'split <-. Default 'y es obvio por qué' a' cambia. –
Y debe usar las comillas inversas para imprimir la función porque el nombre de la función contiene un operador: '\' split <-. Default \ ''. –
En este caso, ¿la función relevante no sería '\' split <-. Data.frame \ ''? – nograpes