此问题的动机是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
会得到与?`^`
相同的结果。
我在^
找不到与此强制有关的任何内容。
修改:Neal的回答清楚地显示matrix
在data.frame
上操作时^
返回{{1}}的原因。如果在这段代码中遗漏了为什么 {{1}}的问题,那就好了。
编辑2:我还发布了bug filed here by Abiel Reinhart并得到了Duncan的回复,似乎没有信息注册。新闻中的这种变化(诚然,正如Joshua和Duncan所指出的那样,这是一个相当古老的变化)。
答案 0 :(得分:22)
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))
所以^
作为矩阵返回。