【问题标题】:stringr vectorization fails when matching first element匹配第一个元素时,stringr 向量化失败
【发布时间】:2018-07-01 05:08:36
【问题描述】:

我在使用stringr 并搜索长度> 1 的pattern 时遇到了一些奇怪的事情。我想最终将str_whichpurrr::map() 一起使用:

searcher <- c("new1", "var1")
purrr::map(data, function(x), any(str_which(x, searcher)))

样本数据

library(stringr)
data <- dplyr::tibble(
                         a = 1:8,
                         b = rep(paste0("var", 1:2), each = 4),
                         c = rep(paste0("new", 1:4), 2))
str_which(data$c, c("new1", "var1"))
#[1] 1 5
str_which(data$c, c("var1", "new1"))
#integer(0)
str_which(data$b, c("var1", "new1"))
#[1] 1 3
str_which(data$b, c("new1", "var1"))
#[1] 2 4
str_which(data$a, c(2, "var1"))
#integer(0)
str_which(data$a, c(3, "var1"))
#[1] 3

此外,我注意到str_locate 的奇怪行为:

str_locate(data$b, c("new1", "var1"))
#     start end
#[1,]    NA  NA
#[2,]     1   4
#[3,]    NA  NA
#[4,]     1   4
#[5,]    NA  NA
#[6,]    NA  NA
#[7,]    NA  NA
#[8,]    NA  NA

【问题讨论】:

  • str_which 是矢量化的,这意味着较短的参数会被回收。所以str_which(data$c, c("new1", "var1")) 是这样的:data$c[1]"new1"data$c[2]"var1"data$c[3]"new1"(看到回收了吗?),data$c[4]"var1" 等等。

标签: r tidyverse stringr


【解决方案1】:

正如 nicola 所指出的,如果您向str_locate 提供字符串向量,它将回收参数。相反,请尝试使用 OR(|) 运算符。尝试类似,

str_locate(data$b, "new1|var1")

     start end
[1,]     1   4
[2,]     1   4
[3,]     1   4
[4,]     1   4
[5,]    NA  NA
[6,]    NA  NA
[7,]    NA  NA
[8,]    NA  NA 

我想这就是你要找的,

purrr::map(data, function(x)str_which(x, "new1|var1"))
$a
integer(0)

$b
[1] 1 2 3 4

$c
[1] 1 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多