Почему "^" на data.frame возвращает матрицу вместо data.frame, например "*"?
Этот вопрос мотивирован ошибкой поданной здесь Abiel Reinhart на data.table
. Я заметил, что то же самое происходит и на data.frame
.
Вот пример:
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"
Почему "^" принуждает его к матрице? Есть идеи? Обратите внимание, что **
преобразуется в ^
парсером. Таким образом, выполнение DF**2
даст тот же результат, что и DF^2
.
Я не нахожу ничего связанного с этим принуждением в ?`^`
.
Изменить: Нильный ответ ясно показывает причину ^
возврата matrix
при работе на data.frame
. Было бы замечательно, если бы вопрос о , почему ^
не учитывается в этом фрагменте кода, также можно ответить.
Изменить 2: Я также разместил здесь, в R-help, и получил ответ от Duncan, что, похоже, нет никакой информации. это изменение в новостях (по общему признанию, это довольно старое изменение, как указывали Джошуа и Дункан).
Ответы
Ответ 1
Ops.data.frame
реализует математические операторы для фреймов данных в качестве генериков S3, вот последние пару строк:
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))
Итак, ^
возвращается как матрица.