我有以下矩阵:
> 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
答案 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)
类似于@akrun对apply
的解决方案,这是base R
的解决方案,使用apply()
和grepl()
apply(myletters, 2, function(v) grepl("[ac]",v))
给出
[,1] [,2]
[1,] TRUE TRUE
[2,] FALSE FALSE