如果通常的`t()`不起作用,如何在r中转置矩阵?

时间:2012-11-26 22:21:57

标签: r matrix transpose

我有一个矩阵我试图在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

2 个答案:

答案 0 :(得分:12)

这个答案是不正确的,但是对我来说很有启发性,对其他人也有启发,所以我会把它留下来。

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

运行时你会得到什么:

rm(t)
t(xx)

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

base::t(xx)

以下是上述两项建议不足的原因

来自?UseMethod

  

命名空间可以注册泛型函数的方法。支持   这个,'UseMethod'和'NextMethod'在两个地方搜索方法:   首先在称为泛型函数的环境中,以及   然后在注册数据库中为其所在的环境   定义泛型(通常是命名空间)。所以通用的方法   函数需要在调用环境中可用   通用的,或者必须注册。 (无论是否他们都没关系   在定义泛型的环境中可见。)

我错误地认为S3方法调度会在t.default()中找到base:::.__S3MethodsTable__. 之类的方法然后在<{1}} < em>在之前查看调用环境,而反之则更接近事实。


从GSee编辑

这是一个交互式会话,用于演示可能存在的问题。

asNamespace("base")

答案 1 :(得分: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)