【问题标题】:Is there an equivalent to dplyr::between for character vectors?字符向量是否有等效于 dplyr::between 的方法?
【发布时间】:2020-10-06 13:08:43
【问题描述】:

我正在使用 tibble,我想提取两个正则表达式之间的行。

首先,我创建一个新列,在其中检测正则表达式并标记它们。

tib <- tibble::tibble(
    x = c('a', 'b', 'c', 'd', 'e'),
    y = c(F, T, F, T, F)
)

# A tibble: 5 x 2
  x     y    
  <chr> <lgl>
1 a     FALSE
2 b     TRUE 
3 c     FALSE
4 d     TRUE 
5 e     FALSE

预期结果:

tib %>% 
    dplyr::filter(
        dplyr::between(x, T, T)
    )

# A tibble: 2 x 2
  x     y    
  <chr> <lgl>
1 b     TRUE 
2 c     FALSE
3 d     TRUE 

dplyr::between() 用于数字向量。无论如何,它不会返回两个 TRUE 对象之间的行。

对于字符向量,是否有等效于 dplyr::between() 的方法?或者也许有人可能会建议使用我创建的布尔对象的另一种方式。

问候,

【问题讨论】:

  • TRUEs 可以多于 2 个吗?还是只有 1 个?预期的输出是什么?
  • 嗨,@markus,预期的结果写在我的命令管道下面tibdplyr::filter。我的情况只有两个TRUEs。

标签: r dplyr tidyr


【解决方案1】:

我首先想到的是slicewhich˙的组合,例如:

library(dplyr)

tib %>%
  slice(first(which(x == 'b')):last(which(x == 'd')))

y 本身:

tib %>%
  slice(first(which(y)):last(which(y)))

输出:

# A tibble: 3 x 2
  x     y    
  <chr> <lgl>
1 b     TRUE 
2 c     FALSE
3 d     TRUE 

【讨论】:

  • 这个维护管道最多。接受。
【解决方案2】:

一种方法是获取TRUE 的索引并创建序列,即

v1 <- which(tib$y)
tib[v1[1]:tail(v1, 1),]

# A tibble: 3 x 2
  x     y    
  <chr> <lgl>
1 b     TRUE 
2 c     FALSE
3 d     TRUE 

【讨论】:

    【解决方案3】:

    我不确定您是否正确理解该功能。但你可以使用regexpr

    r <- regexpr("TFT", paste(substr(as.character(tib$y), 1, 1), collapse=""))
    tib[r:(r + attr(r, "match.length") - 1), ]
    #   x     y
    # 2 b  TRUE
    # 3 c FALSE
    # 4 d  TRUE
    

    【讨论】:

    • 我只是想在这里做个比喻。
    • @iich 是的,但是between 查找哪些值位于下边界和上边界之间,而不是在值的两次出现之间,你知道的。阅读?between
    猜你喜欢
    • 2021-03-02
    • 2016-04-25
    • 2014-04-23
    • 2019-09-12
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多