我有一个矩阵,我试图在 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
这个答案是不正确的,但在某种程度上对我有启发,可能对其他人也有启发,所以我就不说了。
正如@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
也许您可以编写自己的函数:
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)