如何在R中对矩阵进行排序后保持其类别

3

可能是重复问题:
R和只有一行的矩阵

我有数百个矩阵,在for循环中对它们进行一些改变,包括排序。问题在于只有一行的矩阵。所以当我对它们进行排序时,它们的类会从矩阵变成字符,如下所示:

> test1
 Gene ID  Gene Name Score(d) Fold Change q-value(%)
[1,] "g17035" "17035"   "-29.1"  "0.877"     "303.826" 
> class(test1)
[1] "matrix"

当应用排序时,它会变成字符类:

test1 <- test1[order(test1[, 5]), ]

> test1
Gene ID   Gene Name    Score(d) Fold Change  q-value(%) 
"g17035"     "17035"     "-29.1"     "0.877"   "303.826" 
> class(test1)
[1] "character"

我甚至使用了as.matrix,但它改变了矩阵的顺序:

test1 <- as.matrix(test1[order(test1[, 5]), ])

然后它会变成这样:
> test1
    [,1]     
Gene ID     "g17035" 
Gene Name   "17035"  
Score(d)    "-29.1"  
Fold Change "0.877"  
q-value(%)  "303.826"

我应该如何修复它? 提前感谢您。
1个回答

4
你需要做的是不要减少子集的维度,可以使用[后面的drop参数来实现。更多信息请参考?"["
# Demo matrix
> a <- matrix(1:9, 3, 3)
> a
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

# With reduction
> a[1,]
[1] 1 4 7
> class(a[1,])
[1] "integer"

# Without reduction
> a[1,,drop=FALSE]
     [,1] [,2] [,3]
[1,]    1    4    7
> class(a[1,,drop=FALSE])
[1] "matrix"

是的,但问题在于如果我在代码的下一行不使用as.matrix,例如当我想要获取test1的第四列时,我会得到越界的下标。我该如何解决这个问题? - hora
如果您不使用 drop=FALSE,则 test1 将被转换为向量。当您稍后执行 test1[,4] 时,您正在尝试获取向量的列,这是不可能的,因为向量没有任何列。test1 <- test1[order(test1[, 5]),,drop=FALSE](不使用 as.matrix)应该将其保留为具有1行和5列的矩阵,并允许您稍后无问题地提取第4列。 - Backlin
不客气!我曾经也卡在这里很长一段时间。意识到 [, <-, + 等实际上是普通函数,虽然具有常规语法,而且 ?"["?"<-" 为它们提供了良好的文档,这对我帮助很大。 - Backlin
我可以再问一个问题吗?在您的更正下,当我逐行运行程序时,我不再遇到下标越界的错误。但是,当我在函数内运行这些行时,仍然会出现此错误。是否有任何自动转换在函数内执行了此操作? - hora
这对我来说似乎很奇怪。在函数内部运行命令或手动运行命令之间不应该有任何区别。尝试通过设置 options(error=browser) 来调试函数,运行函数以引发错误并确认 test1 是否实际上是它应该的东西。 - Backlin
哦,是的,我找到了,谢谢! - hora

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