【问题标题】:Why does "^" on a data.frame return a matrix instead of a data.frame like "*" does?为什么 data.frame 上的 "^" 返回一个矩阵而不是像 "*" 这样的 data.frame?
【发布时间】:2013-11-26 17:03:03
【问题描述】:

这个问题是由data.table 上的bug filed here by Abiel Reinhart 提出的。我注意到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 的回答清楚地表明了^ 在对data.frame 进行操作时返回matrix 的原因。如果关于为什么 ^ 被遗漏在这段代码中的问题也能得到解答,那就太好了。

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

【问题讨论】:

  • 那么它是一个功能请求?除非您更喜欢默认值。

标签: r dataframe operators exponentiation


【解决方案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))

所以^ 作为矩阵返回。

【讨论】:

  • :) 太好了。非常好的发现!现在知道为什么^ 被遗漏了吗??
  • 根据this repo 的说法,这行代码似乎是用 R 2.2.0 编写的,所以我将其归为“遗留行为”。
  • 您可以轻松地重新定义Ops.data.frame 以将"^" 包含在允许函数的向量中。它将返回具有正确结果的data.frame,但我确信 R-Core 将有一个(好的?)原因来说明为什么它首先不存在。也许这个应该放在 r-help 或 r-devel 中。
  • 自 1999 年 1 月 29 日修订版 3475 以来,这条线大致以这种形式存在。如果这是一个错误,我严重怀疑你现在可以在不破坏任何东西的情况下更改它。
  • @Arun 你会问为什么它会出现在 real 邮件列表中吗?我很想知道回应。
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多