【问题标题】:How to get an index of multiple consecutive elements in R?如何获取R中多个连续元素的索引?
【发布时间】:2021-12-01 08:31:54
【问题描述】:

我有两个长列表,其中一个是另一个的连续子集。 示例:

full= c("cat", "dog", "giraffe", "gorilla", "opossum", "rat")
subset= c("giraffe", "gorilla", "opossum")

有没有一种优雅的方法来获取匹配开始、结束或两者的索引? 在上面的例子中,我想取出3,因为它是“长颈鹿”在全文中的索引?

澄清一下,如果subset= c("giraffe", "rat", "gorilla", "opossum") 输出应该是 NA。

【问题讨论】:

  • 你需要match(subset, full)# [1] 3 4 5
  • 要得到相反的索引,可能是match(subset, rev(full))# [1] 4 3 2
  • 没有。假设子集= c(“长颈鹿”,“老鼠”,“大猩猩”,“负鼠”)。输出应该是 NA。
  • 你到底想要什么?只有3个?即开始?
  • 请考虑用预期的输出更新您的帖子,以便清楚

标签: r list indexing subset


【解决方案1】:

我们可能需要有条件的match

f1 <- function(subvec, fullvec) {
     i1 <- match(subvec, fullvec, nomatch = 0)
     if(any(diff(i1) != 1)) NA else i1[1]
}

-测试

> f1(subset, full)
[1] 3
> f1(subset2, full)
[1] NA
> f1(subset[c(1, 3)], full)
[1] NA

数据

full <- c("cat", "dog", "giraffe", "gorilla", "opossum", "rat")
subset <-  c("giraffe", "gorilla", "opossum")
subset2 <-  c("giraffe", "rat", "gorilla", "opossum")

【讨论】:

  • 这很接近(我喜欢match 潜在的优雅),但不幸的是match(subset[c(1,3)], full) 不太好用。
  • 我在想 OP 想要的顺序相同。如果连续 OP 表示没有间隙,则可以将条件更改为 != 1
【解决方案2】:
zoo::rollapply(full, 3, FUN = identical, subset)
# [1] FALSE FALSE  TRUE FALSE
which(zoo::rollapply(full, 3, FUN = identical, subset))[1]
# [1] 3
zoo::rollapply(full, 3, FUN = func, c("giraffe", "rat", "gorilla", "opossum"))
# [1] FALSE FALSE FALSE FALSE
which(zoo::rollapply(full, 3, FUN = identical, c("giraffe", "rat", "gorilla", "opossum")))[1]
# [1] NA

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多