如果通常的`t()`无法工作,如何在R中转置矩阵?

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

10
你是否重新定义了工作区中的 t 函数? - mnel
1
展示给我们 methods(t) 的输出。 - GSee
感谢大家,问题现在已经解决了....:)..我使用了rm()函数。 - user1854786
3
@JoshO'Brien - 那个建议很荒谬... 没有人会写那个函数... 显然是 t <- function(x){apply(x, 2, sd)} - Dason
3
为什么你删除了你的答案?我觉得它挺好的。 - Ben Bolker
显示剩余4条评论
2个回答

12

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

正如 @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

1
如果t.default被屏蔽了,或者定义了一个t.matrix方法,那就没什么帮助了...;-) - GSee
@GSee -- 这应该会有所帮助。base::t(xx) 应该首先查找 asNamespace("base"),这样即使同名函数在其他地方注册,它也能找到 t.default(),对吗? - Josh O'Brien
2
首先使用在您的 globalenv() 中定义的方法。 - GSee
谢谢你们两位,但实际上我正在尝试生成一个卡方图。我定义的函数是qqplot<-function (xx) { n=length(xx[,1]);p=length(xx[1,]) xbar=colMeans(as.data.frame(xx));ss=var(xx) ssinv=solve(ss);d2=c() for (i in (1:n)){ xi=cbind(xx[i,]-xbar) d2=c(d2,t(xi)%%ssinv%%xi) } q=qchisq(((1:n)-0.5)/n,p)plot(q,sort(d2),type="p",pch=20,col="red",xlab="q",ylab="d^2",main="Chi-squa re Quantile Plot") } - user1854786
3
你正在养成不好的习惯! qqplotstats 包中的一个函数,该包已默认加载。正如你所见,创建与现有名称相同的函数可能会非常令人困惑;你应该避免这样做,并重新命名你自己的函数。 - Gregor Thomas
显示剩余2条评论

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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接