7

我有一个矩阵,我试图在 R 中转置,但 t() 函数没有返回正确的答案。如何转置矩阵?

> xx=matrix(c(3,7,4,8),2,byrow=TRUE)
> xx
     [,1]  [,2]
[1,]    3     7
[2,]    4     8
> t(xx)
[1] 0.7071068 0.7071068
4

2 回答 2

12

这个答案是不正确的,但在某种程度上对我有启发,可能对其他人也有启发,所以我就不说了。

正如@mnel 所指出的,基本的 R 函数t()必须被另一个同名的函数屏蔽。尝试删除该功能t()t(xx)再次执行。我保证你会得到正确的结果。

当你运行这个时你会得到什么:

rm(t)
t(xx)

如果(尽管我保证!)它仍然不起作用,您可以完全指定t()要使用的版本,如下所示:

base::t(xx)

这就是为什么上面的两个建议是不够​​的

来自?UseMethod

命名空间可以为泛型函数注册方法。为了支持这一点,“UseMethod”和“NextMethod”在两个地方搜索方法: 首先在调用泛型函数的环境中,然后在定义泛型的环境的注册数据库中(通常是命名空间)。因此,泛型函数的方法需要在调用泛型的环境中可用,或者必须注册。(它们在定义泛型的环境中是否可见并不重要。)

我错误地认为 S3 方法分派会t.default() 查找方法, base:::.__S3MethodsTable__.然后查找调用环境,asNamespace("base")反过来则更接近事实。


从 GSee 编辑

这是一个交互式会话来演示可能是什么问题。

> t <- function(x, ...) print("generic masked")
> t.default <- function(x, ...) print("t.default masked")
> t.matrix <- function(x, ...) print("t.matrix was used")
> t.numeric <- function(x, ...) print("t.numeric was used")
> xx=matrix(c(3,7,4,8),2,byrow=TRUE)
> t(xx)
[1] "generic masked"
> base::t(xx)
[1] "t.matrix was used"
> rm(t.matrix)
> base::t(xx)
[1] "t.numeric was used"
> rm(t.numeric)
> base::t(xx)
[1] "t.default masked"
> rm(t.default)
> base::t(xx)
     [,1] [,2]
[1,]    3    4
[2,]    7    8
于 2012-11-26T22:30:22.217 回答
0

也许您可以编写自己的函数:

xx <- matrix(c(3,7,4,8), 2, byrow = TRUE)
transp <- function(n){
    TM <- matrix(, nrow = ncol(n), ncol = nrow(n))
        for (i in 1 : nrow(TM)){
            for (j in 1 : ncol(TM)){
                TM[i, j] <- n[j, i]
            }
        }
    print(TM)
} 
transp(xx)

于 2020-11-19T19:02:51.197 回答