R检查数据框中是否存在元素并返回其索引

时间:2019-04-24 14:18:33

标签: r

我有一个看起来像这样的数据框

index     id
1         abc;def;ghi;jkl;mno
2         bcd;efg;hij;klm;nop
3         cde;fgh;ijk;lmn;opq
.
.
.

我想使用R查找数据框中是否包含“ abc”并返回其索引。

我尝试将“ id”列分为5个不同的列,并查找每行中是否包含“ abc”。但是我的数据集包含约200,000行。遍历每一行都需要很长时间。我想知道是否有更有效的方法来检测它。

例如,“ abc”是df $ id [1]的一部分,则结果应返回1;否则,结果将返回1。 “ cde”应返回3。

3 个答案:

答案 0 :(得分:2)

您可以将which函数与grepl结合使用,如下所示:

which(grepl("abc", df$id))
如果字符串中包含“ abc”,则

grepl返回TRUE,否则返回FALSEwhich返回包含TRUE的条目的索引。

使用grep甚至更容易:

grep("abc", df$id)

答案 1 :(得分:1)

尝试:

library(stringr)

df[str_detect(df$id, "abc"), "index"]

答案 2 :(得分:1)

我最近一直在使用%g%运算符(受%in%启发)来做这种事情:

library(tidyverse)

`%g%` <- function(x,y) {
  z <- paste0(y, collapse = "|")
  grepl(z, x, ignore.case = T)
}

df <- read.table(h = T,
                 stringsAsFactors = F,
                 text = "index     id
                         1         abc;def;ghi;jkl;mno
                         2         bcd;efg;hij;klm;nop
                         3         cde;fgh;ijk;lmn;opq")

df %>% 
  filter(id %g% "abc") %>% 
  pull(index)
#> [1] 1

df %>% 
  filter(id %g% "cde") %>% 
  pull(index)
#> [1] 3

这也支持多个值:

df %>% 
  filter(id %g% c("abc", "cde")) %>% 
  pull(index)
#> [1] 1 3

reprex package(v0.2.1)于2019-04-24创建