保留1行/-列矩阵

4

如果给定一个只有一行、一列或一个单元格的矩阵,我需要重新排序行,同时保持矩阵结构。我尝试添加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

2
class(test[5:1,,drop=F]) 给我返回一个矩阵。 - Ronak Shah
是的,我重新启动了RStudio后,事情回到了正常。我不知道发生了什么。 - dasf
1
你可以使用base::[来确保你没有获取到一些重新映射的[ - Harlan Nelson
Harlan,我之前见过 base::,但只是模糊地知道它与 R 的环境有关。我该如何使用 base:: [`? - dasf
1
我猜更可能是被覆盖的 F;F 可以被设置为变量,这样它就不再是 false。始终完整地写出 FALSE,它不能被设置为变量。(详见答案。) - Aaron left Stack Overflow
1
嘿 @dasf,我打算进行编辑,这样它看起来就不像是一个不可重复的错误了。 - Aaron left Stack Overflow
3个回答

7
我猜这可能是被覆盖的 FF 可以作为变量设置,这样它就不再是 false。始终完整地写出 FALSE,它不能被设置为变量。
请参见 使用 T 和 F 而不是 TRUE 和 FALSE 有什么问题吗? 此外,R 地狱, 第 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" 

这正是发生的事情!谢谢你! - dasf

2

您问题中的代码在新的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

也许您加载了其他覆盖默认行为的包?您为什么认为您不会得到一个矩阵?

嗯,你说得对。在我重新启动Rstudio之后,代码确实可以运行。我想知道是什么导致了这种情况。让我做一些实验并向小组报告结果。 - dasf
嘿,Gregor,我认为我们应该重新打开这个问题,你能看一下吗? - Aaron left Stack Overflow
你是否也可以为“为什么na.rm = Tmean不起作用?”,“为什么stringsAsFactors = F不起作用?”等创建问题和答案对?这个问题必须具有一定的普适性,否则就是荒谬的,这就是为什么我认为将其标记为重复问题是合适的原因。我不认为上述问题是一个理想的重复目标,但也许可以针对一般问题进行一些专门的处理,比如关于“为什么TF不能用于TRUEFALSE?”的新R-FAQ(如果这样的东西还不存在的话)。如果你想把它编辑成一些通用的内容,并且OP同意,那么我会很高兴接受这个解决方案。 - Gregor Thomas
关闭为重复问题比关闭为不相关问题更好。非版主可以这样做吗,还是我们需要标记它?我认为链接的问题也适用于这个问题,它似乎已经很经典了。通常我在 SO 的阵营中不介意类似的问题,并倾向于不关闭或不重复,尽管我们在活跃的 SO 群体中绝对是少数派,唉... - Aaron left Stack Overflow
一个模组可以立即执行它。我已经投了重新开放的票(我们现在有2票),但需要5票才能重新开放。我的声望足够高,我可以独自关闭作为重复的问题,但重新开放后可能不起作用。你可以向模组标记并提出建议。 - Gregor Thomas
显示剩余4条评论

0

以下代码可正常运行:

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

当你使用is.matrix进行测试时,输出结果是一个矩阵。同时,你可以指定行数(nrow)和列数(ncol)来强制转换为你需要的行数和列数。


但是,由于矩阵会将一个1行2列的矩阵转换为一个2行1列的矩阵。我需要一些可以保留原始维度的东西。 - dasf
@dasf 我已经编辑了我的答案。它回答了你的问题吗?结果是一个矩阵,可以根据你的要求预先指定结果矩阵的行和列(例如5行1列)。 - DTYK
1
似乎过于复杂了... - Gregor Thomas
好的,这可能可行,但我必须找出矩阵有多少行和列。我刚意识到,我可以通过执行类似于 dim(new) = dim(old) 的操作将重新排序的非矩阵转换为原始矩阵的维度。 - dasf
@Gregor 我按照主题发起者的要求添加了行和列,是的,你的答案也可以,并且更加简洁。 - DTYK

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