R:保持1行/列矩阵

R:保持1行/列矩阵,r,matrix,subset,R,Matrix,Subset,给定一个包含一行、一列或一个单元格的矩阵,我需要在保持矩阵结构的同时对行进行重新排序。我尝试添加drop=F,但它不起作用!我做了什么 test = matrix(letters[1:5]) # is a matrix test[5:1,,drop=F] # not a matrix test2 = matrix(letters[1:5],nrow=1) # is a matrix test2[1:1,,drop=F] # not a ma

给定一个包含一行、一列或一个单元格的矩阵,我需要在保持矩阵结构的同时对行进行重新排序。我尝试添加
drop=F
,但它不起作用!我做了什么

test = matrix(letters[1:5]) # is a matrix
test[5:1,,drop=F]           # not a matrix

test2 = matrix(letters[1:5],nrow=1) # is a matrix
test2[1:1,,drop=F]                  # not a matrix

test3 = matrix(1)  # is a matrix
test3[1:1,,drop=F] # not a matrix
以下工作:

test <- matrix(test[5:1,, drop = F], nrow = 5, ncol = 1)

test问题中的代码在新的R会话中运行良好:

test = matrix(letters[1:5]) # is a matrix
result = test[5:1,,drop=F]  
result
#      [,1]
# [1,] "e" 
# [2,] "d" 
# [3,] "c" 
# [4,] "b" 
# [5,] "a" 
class(result)  # still a matrix
# [1] "matrix"
dim(result)
# [1] 5 1
即使在1x1矩阵上:

test3 = matrix(1)  # is a matrix
result3 = test3[1:1,,drop=F]
class(result3)
# [1] "matrix"
dim(result3)
# [1] 1 1

也许您已经加载了其他覆盖默认行为的包?是什么让你觉得你最终没有得到一个矩阵?

我猜这是一个被覆盖的
F
F
可以设置为变量,在这种情况下,它不再为false。始终完全写出
FALSE
,不能将其设置为变量

第8.1.32节也是一个很好的参考

> F <- 1
> test = matrix(letters[1:5]) # is a matrix
> test[5:1,,drop=F]           # not a matrix
[1] "e" "d" "c" "b" "a"
> test[5:1,,drop=FALSE]       # but this is a matrix
     [,1]
[1,] "e" 
[2,] "d" 
[3,] "c" 
[4,] "b" 
[5,] "a" 
> rm(F)
> test[5:1,,drop=F]           # now a matrix again
     [,1]
[1,] "e" 
[2,] "d" 
[3,] "c" 
[4,] "b" 
[5,] "a" 
>F test=matrix(字母[1:5])#是一个矩阵
>测试[5:1,drop=F]#不是矩阵
[1] “e”“d”“c”“b”“a”
>测试[5:1,drop=FALSE]#但这是一个矩阵
[,1]
[1,]“e”
[2,]“d”
[3,]“c”
[4,]“b”
[5,]“a”
>rm(F)
>测试[5:1,drop=F]#现在又是一个矩阵
[,1]
[1,]“e”
[2,]“d”
[3,]“c”
[4,]“b”
[5,]“a”

但as矩阵会将一行2列矩阵转换为两行1列矩阵。我需要一些可以保留原始尺寸的东西。@dasf我已经编辑了我的答案。它回答了你的问题吗?结果是一个矩阵,结果矩阵的行和列可以根据您的需要预先指定(例如5行和1列)。似乎不必要的复杂…好的,这可以工作,但我必须找出矩阵有多少行和列。我刚刚意识到,我可以通过做一些像
dim(new)=dim(old)
@Gregor这样的事情,将重新排序的非矩阵强制转换为原始矩阵的维度。我在主题启动者要求的行和列中添加了它,是的,你的答案也很有效,而且更简洁。
class(test[5:1,drop=F])
给了我一个矩阵。是的,重新启动RStudio后,一切恢复正常。我不知道发生了什么。你可以使用base::
[
来确保你没有得到一些重新映射的
[
。我想这更可能是一个被覆盖的
F
;F可以设置为变量,在这种情况下,它不再是false。始终完整地写出
false
,它不能设置为变量。(详情请参阅答案。)嘿@dasf,我要编辑它,这样它看起来就不会像是一个不可重复的错误。嗯,你是对的。代码在我重新启动Rstudio后确实可以工作。我想知道是什么导致了这种情况。让我做一点实验,然后向小组报告。嘿,Gregor,我想我们应该重新打开这个,你看一看吗?@Aaron我不同意。分配变量
T
F
是一个常见问题。因为这是一个非常特殊的系统,所以
drop=F
不起作用。如果有什么问题,我会将其标记为已链接的“使用T&F而不是TRUE&FALSE有什么问题吗?”问题。你认为重新开始这个问题有什么好处?这可能是一个常见的问题,但它不是一个明显的答案(从我之前的答案和急于结束之前的答案可以看出)。我认为,对于可能有这个问题的未来读者,有一个明确回答这个问题的问题是有价值的。标记为dup可能有效,但实际上,这是一个重复的答案,但不是一个重复的问题。当然,它不再脱离主题,因为它不能被复制。您是否也会为其创建q/a对“为什么
na.rm=T
不适用于
mean
?”“为什么
stringsAsFactors=F”
不适用?”等等?这个问题必须有某种程度的概括性,否则就是荒谬的,这就是为什么标记为dupe对我来说似乎是合适的。我不认为上面的Q是一个理想的dupe目标,但可能是关注一般问题,可能是一个新的R-FAQ“为什么
t
F
不适用于
TRUE
FALSE
?”(如果这样的东西还不存在的话)。如果你想把它编辑成一般性的东西,并且OP是可以接受的,我很乐意接受这个解决方案。这正是发生的事情!谢谢!