为什么data.frame上的“^”返回矩阵而不是像“*”那样的data.frame?

时间:2013-11-13 21:37:39

标签: r dataframe operators exponentiation

此问题的动机是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的回答清楚地显示matrixdata.frame上操作时^返回{{1}}的原因。如果在这段代码中遗漏了为什么 {{1}}的问题,那就好了。

编辑2:我还发布了bug filed here by Abiel Reinhart并得到了Duncan的回复,似乎没有信息注册。新闻中的这种变化(诚然,正如Joshua和Duncan所指出的那样,这是一个相当古老的变化)。

1 个答案:

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

所以^作为矩阵返回。