从矩阵创建布尔矩阵

时间:2019-12-01 18:50:45

标签: r matrix stringr

我有以下矩阵:

> myletters <- matrix(letters[1:4], ncol = 2)
> myletters
     [,1] [,2]
[1,] "a"  "c" 
[2,] "b"  "d" 

现在,我要检查每个单元格中是否有“ a”或“ c”。

> str_detect(myletters, "[ac]")
[1]  TRUE FALSE  TRUE FALSE

现在我有一个逻辑向量,但我想有一个矩阵。 我想要的输出将是:

      [,1]  [,2]
[1,]  TRUE  TRUE
[2,] FALSE FALSE

不要误会我的意思,当然,我知道一些可能的解决方法,但是我认为类似matrix(str_detect(myletters, "[ac]"), ncol = 2)的解决方案很难看。一定有更好的方法? 而且我不知道为什么会这样。这种情况与以下获得期望输出的情况有什么区别?

> matrix(1:4, ncol = 2) > 2
      [,1] [,2]
[1,] FALSE TRUE
[2,] FALSE TRUE

3 个答案:

答案 0 :(得分:2)

一个选项是

SELECT 
TIMESTAMPDIFF
( YEAR, '2019-10-15',
 '2020-10-15' 
+ INTERVAL 1 YEAR
- INTERVAL 1 DAY ) 
AS `year` 
FROM dob

函数out <- `dim<-`(myletters %in% c("a", "c"), dim(myletters)) out # [,1] [,2] #[1,] TRUE TRUE #[2,] FALSE FALSE 可以实现

  

检索或设置对象的尺寸。

答案 1 :(得分:1)

我们可以将其分配回来,以获取<-的原始数据的结构。 matrix是具有vector属性的dim。当我们使用str_detect时,属性会丢失,因此我们得到了一个纯向量。

library(stringr)
out <- myletters
out[] <- str_detect(myletters, "[ac]")
class(out) <- "logical"  
out
#     [,1]  [,2]
#[1,]  TRUE  TRUE
#[2,] FALSE FALSE

或者即时执行此操作的另一种方法是使用structure

structure(str_detect(myletters, "[ac]"), dim = dim(myletters))
#      [,1]  [,2]
#[1,]  TRUE  TRUE
#[2,] FALSE FALSE

或使用apply

apply(myletters, 2, str_detect, "[ac]")
#       [,1]  [,2]
#[1,]  TRUE  TRUE
#[2,] FALSE FALSE

或者,如果我们需要purrr语法,请转换为data.frame并在列上应用map

library(purrr)
as.data.frame(myletters) %>%
    map_df(str_detect, "[ac]")

当我们转换为data.frame时,也可以应用mutate_all

library(dplyr)
as.data.frame(myletters) %>%
      mutate_all(str_detect, "[ac]")

答案 2 :(得分:0)

类似于@akrunapply的解决方案,这是base R的解决方案,使用apply()grepl()

apply(myletters, 2, function(v) grepl("[ac]",v))

给出

      [,1]  [,2]
[1,]  TRUE  TRUE
[2,] FALSE FALSE