我有:
B <- matrix(c(1, 0, 0, 1, 1, 1),
nrow=3,
ncol=2)
我想要:
B
[,1] [,2]
[1,] TRUE TRUE
[2,] FALSE TRUE
[3,] FALSE TRUE
as.logical(B)
提供一维向量。是否有惯用的方式进行矩阵类型转换?
我目前正在罗word:
boolVector <- as.logical(B)
m <- nrow(B)
n <- ncol(B)
m <- matrix(boolVector, m , n)
m
答案 0 :(得分:6)
mode(B) <- "logical"
或"mode<-"(B, "logical")
。我们还可以使用storage.mode
函数。
此解决方法很好,有两个原因:
当我读取带有编译代码的某些软件包的源代码时,我学到了这个技巧。当将R数据结构传递给C或FORTRAN函数时,可能需要某种类型的强制,它们通常为此目的使用mode
或storage.mode
。这两个函数都保留R对象的属性,例如矩阵的“暗”和“暗名”。
## an integer matrix
A <- matrix(1:4, nrow = 2, dimnames = list(letters[1:2], LETTERS[1:2]))
# A B
#a 1 3
#b 2 4
"mode<-"(A, "numeric")
# A B
#a 1 3
#b 2 4
"mode<-"(A, "logical")
# A B
#a TRUE TRUE
#b TRUE TRUE
"mode<-"(A, "chracter")
# A B
#a "1" "3"
#b "2" "4"
"mode<-"(A, "complex")
# A B
#a 1+0i 3+0i
#b 2+0i 4+0i
str("mode<-"(A, "list")) ## matrix list
#List of 4
# $ : int 1
# $ : int 2
# $ : int 3
# $ : int 4
# - attr(*, "dim")= int [1:2] 2 2
# - attr(*, "dimnames")=List of 2
# ..$ : chr [1:2] "a" "b"
# ..$ : chr [1:2] "A" "B"
请注意,只能在向量的合法模式之间进行模式更改(请参见?vector
)。 R中有许多模式,但是矢量只允许其中一些模式。我在my this answer中进行了介绍。
此外,“ factor”不是矢量(请参见?vector
),因此您不能对factor变量进行模式更改。
f <- factor(c("a", "b"))
## this "surprisingly" doesn't work
mode(f) <- "character"
#Error in `mode<-`(`*tmp*`, value = "character") :
# invalid to change the storage mode of a factor
## this also doesn't work
mode(f) <- "numeric"
#Error in `mode<-`(`*tmp*`, value = "numeric") :
# invalid to change the storage mode of a factor
## this does not give any error but also does not change anything
## because a factor variable is internally coded as integer with "factor" class
mode(f) <- "integer"
f
#[1] a b
#Levels: a b
答案 1 :(得分:4)
matrix
是具有vector
属性的dim
。当我们应用as.logical
时,dim
属性将丢失。可以使用dim<-
`dim<-`(as.logical(B), dim(B))
# [,1] [,2]
#[1,] TRUE TRUE
#[2,] FALSE TRUE
#[3,] FALSE TRUE
或者另一个选择是创建保留属性结构的逻辑条件
B != 0
或
!!B