为啥 data.frame 上的 "^" 返回一个矩阵而不是像 "*" 这样的 data.frame?

Posted

技术标签:

【中文标题】为啥 data.frame 上的 "^" 返回一个矩阵而不是像 "*" 这样的 data.frame?【英文标题】: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 也指出的那样)。

【问题讨论】:

那么它是一个功能请求?除非您更喜欢默认值。 【参考方案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 邮件列表中吗?我很想知道回应。

以上是关于为啥 data.frame 上的 "^" 返回一个矩阵而不是像 "*" 这样的 data.frame?的主要内容,如果未能解决你的问题,请参考以下文章

read.csv() 读取 data.frame OK readr::read_csv() for the same data.frame 失败,为啥?

as.data.frame(x) 和 as(x, "data.frame") 的区别

as.data.frame.default(dtm) 中的错误:无法将类 "c("DocumentTermMatrix", "simple_triplet_ma

覆盖使用 Dplyr - R 过滤的 data.frame 上的值

Annotation_logticks() 错误。 `$<-.data.frame`(`*tmp*`, "PANEL", value = c(1L, 8L, 7L, 6L,

r语言怎么调用data.frame数据框的某列数据