listas - ¿Por qué "^" en un data.frame devuelve una matriz en lugar de un data.frame como "*"?
listas en r (1)
Esta pregunta está motivada por un error presentado aquí por Abiel Reinhart en data.table
. Noté que lo mismo sucede en data.frame
también.
Aquí hay un ejemplo:
DF <- data.frame(x=1:5, y=6:10)
> DF*DF
x y
1 1 36
2 4 49
3 9 64
4 16 81
5 25 100
> class(DF*DF) # [1] "data.frame"
> DF^2
x y
[1,] 1 36
[2,] 4 49
[3,] 9 64
[4,] 16 81
[5,] 25 100
> class(DF^2) # [1] "matrix"
¿Por qué "^" lo coacciona en una matriz? ¿Algunas ideas? Tenga en cuenta que **
se convierte en ^
por el analizador. Entonces, hacer DF**2
daría el mismo resultado que DF^2
.
No encuentro nada relacionado con esta coacción en ?`^`
.
Editar: La respuesta de Neal muestra claramente el motivo por el cual se devuelve una matrix
cuando se opera en un data.frame
. Sería genial si la pregunta sobre por qué ^
se deja fuera en ese fragmento de código pudiera ser respondida también.
Editar 2: también publiqué aquí en R-help y obtuve una respuesta de Duncan que parece que no hay información reg. este cambio en las NOTICIAS (es cierto, es un cambio bastante antiguo como también lo señalaron Joshua y Duncan).
Ops.data.frame
implementa los operadores matemáticos para marcos de datos como genéricos S3, estas son las últimas líneas:
if (.Generic %in% c("+", "-", "*", "/", "%%", "%/%")) {
names(value) <- cn
data.frame(value, row.names = rn, check.names = FALSE,
check.rows = FALSE)
}
else matrix(unlist(value, recursive = FALSE, use.names = FALSE),
nrow = nr, dimnames = list(rn, cn))
Entonces ^
se devuelve como una matriz.