我有一个矩阵,我试图在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发布于 2012-11-27 06:30:22
这个答案是不正确的,但它的方式对我很有启发性,也可能对其他人有启发,所以我就把这个问题留给大家。
正如@mnel所指出的,基本R函数t()必须被另一个同名的函数屏蔽。尝试删除函数t()并再次执行t(xx)。我保证你会得到正确的结果。
当你运行下面的代码时,你会得到什么:
rm(t)
t(xx)如果(尽管我保证!)它仍然不起作用,您可以完全指定要使用的t()版本,如下所示:
base::t(xx)这里解释了为什么上面的两个建议是不充分的
来自?UseMethod
命名空间可以注册泛型函数的方法。为了支持这一点,‘UseMethod’和‘NextMethod’在两个地方搜索方法:首先在泛型函数调用的环境中,然后在定义泛型的环境(通常是名称空间)的注册数据库中。因此,泛型函数的方法需要在调用泛型函数的环境中可用,否则必须注册它们。(它们在定义类属的环境中是否可见并不重要。)
我错误地认为S3方法分派首先在base:::.__S3MethodsTable__.中查找像t.default()这样的方法,然后可能在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发布于 2020-11-20 03:02:51
也许你可以编写你自己的函数:
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)https://stackoverflow.com/questions/13574165
复制相似问题