为啥 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,