R 转换;“字符”;矩阵到";逻辑的;

R 转换;“字符”;矩阵到";逻辑的;,r,matrix,R,Matrix,我有一个矩阵(值为类字符),如下所示: mat <- matrix(c("0", "TRUE", "1", "2", "FALSE", "TRUE", "TRUE", "2"), nrow = 4, ncol = 2) #> mat # [,1] [,2] #[1,] "0" "FALSE" #[2,] "TRUE" "TRUE" #[3,] "1" "TRUE" #[4,] "2" "2" as.logi

我有一个矩阵(值为
字符
),如下所示:

mat <- matrix(c("0", "TRUE", "1", "2",
                "FALSE", "TRUE", "TRUE", "2"), nrow = 4, ncol = 2)
#> mat
#     [,1]   [,2]   
#[1,] "0"    "FALSE"
#[2,] "TRUE" "TRUE" 
#[3,] "1"    "TRUE" 
#[4,] "2"    "2"  
as.logical
NA
s输出为“字符数字”值,而
as.numeric
NA
s输出为“字符逻辑”值

我找到了一个解决方案,但我认为我遗漏了一些显而易见的东西,比如立即转换:

new_mat2 <- array(as.numeric(mat), dim(mat))
new_mat <- array(as.logical(mat), dim(mat))

new_mat[is.na(new_mat)] <- new_mat2[is.na(new_mat)]
mat2 <- array(as.logical(new_mat), dim(new_mat))

#> mat2
#      [,1]  [,2]
#[1,] FALSE FALSE
#[2,]  TRUE  TRUE
#[3,]  TRUE  TRUE
#[4,]  TRUE  TRUE
new_mat2试试这个:

> mat[,] <- ifelse(mat %in% c("0", "FALSE"), FALSE, TRUE) # pay attention to @Señor O comment to shorten this step.
> mat
     [,1]    [,2]   
[1,] "FALSE" "FALSE"
[2,] "TRUE"  "TRUE" 
[3,] "TRUE"  "TRUE" 
[4,] "TRUE"  "TRUE" 

NA
是一个逻辑常数,因此它有必须遵守的真值表法则。我们可以利用这些法则来做

mat2 <- as.logical(mat) & ( as.integer(mat) > 0 )
mat2[is.na(mat2)] <- TRUE
dim(mat2) <- dim(mat)
#      [,1]  [,2]
#[1,] FALSE FALSE
#[2,]  TRUE  TRUE
#[3,]  TRUE  TRUE
#[4,]  TRUE  TRUE
mat2(0)
mat2[is.na(mat2)]mat!=“0”和mat!=“假”


我所知道的最直接的是:

as.numeric(因子(矩阵))


其中‘matrix’是我们要更改为数值的矩阵的名称

如何
mat[,]谢谢!我没有想到用%
这样操作
%!我会接受的,不过——说实话——我希望在
R
的函数或帮助页面中有一些我没有注意到(但应该注意到)的东西。不过,不要让我的接受打消你的勇气,如果你有任何见解的话!:)再次感谢!我真的很感谢对“
NA
as logical”这件事的洞察;我从来没有想过这是一种需要。我急切地等待着回答:“你知道吗…”谢谢@亚历克西斯·拉兹,不客气。不过,你必须小心使用
NA
。在逻辑运算符的帮助页面底部有一些真值表(try
?`!`
),这也会丢失dimnames@JeremyLeipzig这不是OP的一部分,但是如果说问题中的矩阵
mat
确实有您希望在转换后保留的名称,那么它就简单到
dimnames(mat2)
> mat <- sapply(as.data.frame(mat), as.logical)
> mat
        V1    V2
[1,] FALSE FALSE
[2,]  TRUE  TRUE
[3,]  TRUE  TRUE
[4,]  TRUE  TRUE
> sapply(mat, class)  # checking class
[1] "logical" "logical" "logical" "logical" "logical" "logical" "logical" "logical"
mat2 <- as.logical(mat) & ( as.integer(mat) > 0 )
mat2[is.na(mat2)] <- TRUE
dim(mat2) <- dim(mat)
#      [,1]  [,2]
#[1,] FALSE FALSE
#[2,]  TRUE  TRUE
#[3,]  TRUE  TRUE
#[4,]  TRUE  TRUE
> mat
     [,1]   [,2]   
[1,] "0"    "FALSE"
[2,] "TRUE" "TRUE" 
[3,] "1"    "TRUE" 
[4,] "2"    "2"    

> mat != "0" & mat != "FALSE"
      [,1]  [,2]
[1,] FALSE FALSE
[2,]  TRUE  TRUE
[3,]  TRUE  TRUE
[4,]  TRUE  TRUE