我有一个矩阵(值class
character
就像这样:
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"
我需要将它转换为这样的矩阵:
[,1] [,2]
[1,] FALSE FALSE
[2,] TRUE TRUE
[3,] TRUE TRUE
[4,] TRUE TRUE
as.logical
将NA
输出为“字符数字”值,而as.numeric
将NA
输出为“字符逻辑”值。
我找到了一个解决方案,但我认为我错过了一些明显可以立即转换的内容:
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
有什么建议吗?
答案 0 :(得分:14)
试试这个:
> 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"
如果您希望mat
成为由逻辑值组成的data.frame,则:
> 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"
答案 1 :(得分:3)
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
如果您的原始矩阵中没有NA
,那么这只会 ,因为我们依赖于NA
本身就是一个逻辑常量。如果给定的值为FALSE
,则as.logical
将评估为TRUE
,但不能(&
)为as.integer
,因此会FALSE
。如果"0"
as.logical
将评估为NA
,而as.integer > 0
将评估为FALSE
。 NA
&amp; FALSE
评估为FALSE
。满足两个FALSE条件,因此剩余的NA
必须为TRUE
。
答案 2 :(得分:3)
mat!=&#34; 0&#34; &安培; mat!=&#34; FALSE&#34;
> 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
答案 3 :(得分:0)
我所知道的最直接的是:
as.numeric(factor(matrix))
其中'matrix'是我们想要更改为数字
的矩阵的名称