Question

This question is motivated by a bug filed here by Abiel Reinhart on data.table. I noticed that the same happens on data.frame as well.

Here's an example:

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"

Why does "^" coerce it into a matrix? Any ideas? Note that ** is converted to ^ by the parser. So, doing DF**2 would give the same result as DF^2.

I don't find anything related to this coercion in ?`^`.

Edit: Neal's answer shows clearly the reason for ^ returning a matrix when operated on a data.frame. It'd be great if the question as to why ^ is being left out in that piece of code could be answered as well.

Edit 2: I also posted here on R-help and got a reply from Duncan that there seems to be no info reg. this change in the NEWS (admittedly, it's a quite old change as Joshua and Duncan also pointed out).

Was it helpful?

Solution

Ops.data.frame implements the math operators for data frames as S3 generics, here is the last couple lines:

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

So ^ gets returned as a matrix.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top