我有一个看起来像这样的数据框
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。
答案 0 :(得分:2)
您可以将which
函数与grepl
结合使用,如下所示:
which(grepl("abc", df$id))
如果字符串中包含“ abc”,则 grepl
返回TRUE
,否则返回FALSE
。
which
返回包含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创建