假设我有以下数据框:
User.Id Tags
34234 imageUploaded,people.jpg,more,comma,separated,stuff
34234 imageUploaded
12345 people.jpg
我如何使用grep(或其他工具)只捕获包含“imageUploaded”和“people”的行?换句话说,我怎样才能创建一个只包含字符串“imageUploaded”和“people.jpg”的行的子集,无论顺序如何。
我试过了:
data.people<-data[grep("imageUploaded|people.jpg",results$Tags),]
data.people<-data[grep("imageUploaded?=people.jpg",results$Tags),]
是否有AND运营商?或者也许是另一种获得预期结果的方法?
答案 0 :(得分:19)
感谢this answer,这个正则表达式似乎有效。您希望使用grepl()
返回逻辑索引到数据对象中。我不会声称完全理解正则表达式的内部运作,但无论如何:
x <- c("imageUploaded,people.jpg,more,comma,separated,stuff", "imageUploaded", "people.jpg")
grepl("(?=.*imageUploaded)(?=.*people\\.jpg)", x, perl = TRUE)
#-----
[1] TRUE FALSE FALSE
答案 1 :(得分:11)
我喜欢@Chase的答案,这对我来说很有意义,但使用一个人们并不完全理解的结构会有点危险。
这个答案是为了让任何想要使用@thelatemail更直接的方法的人放心,它的工作原理同样适用,并且速度完全具有竞争力。这肯定是我在这种情况下使用的。 (同样令人放心的是,更复杂的Perl兼容正则表达式不会为其功能和易扩展性而付出任何性能成本。)
library(rbenchmark)
x <- paste0(sample(letters, 1e6, replace=T), ## A longer vector of
sample(letters, 1e6, replace=T)) ## possible matches
## Both methods give identical results
tlm <- grepl("a", x, fixed=TRUE) & grepl("b", x, fixed=TRUE)
pat <- "(?=.*a)(?=.*b)"
Chase <- grepl(pat, x, perl=TRUE)
identical(tlm, Chase)
# [1] TRUE
## Both methods are similarly fast
benchmark(
tlm = grepl("a", x, fixed=TRUE) & grepl("b", x, fixed=TRUE),
Chase = grepl(pat, x, perl=TRUE))
# test replications elapsed relative user.self sys.self
# 2 Chase 100 9.89 1.105 9.80 0.10
# 1 thelatemail 100 8.95 1.000 8.47 0.48
答案 2 :(得分:8)
为了便于阅读,您可以这样做:
x <- c(
"imageUploaded,people.jpg,more,comma,separated,stuff",
"imageUploaded",
"people.jpg"
)
xmatches <- intersect(
grep("imageUploaded",x,fixed=TRUE),
grep("people.jpg",x,fixed=TRUE)
)
x[xmatches]
[1] "imageUploaded,people.jpg,more,comma,separated,stuff"
答案 3 :(得分:1)
以下是使用hadley&#39; stringr::str_detect()
的grep的替代方法。这避免了使用perl=true
@ jan-stanstrup。此外,dplyr::filter()
将返回数据框内的行,因此您永远不需要离开df。
library(stringr)
libary(dplyr)
x <- data.frame(User.Id =c(34234,34234,12345),
Tags=c("imageUploaded,people.jpg,more,comma,separated,stuff",
"imageUploaded",
"people.jpg"))
data.people <- x %>% filter(str_detect(Tags,"(?=.*imageUploaded)(?=.*people\\.jpg)"))
data.people
# returns
# User.Id Tags
# 1 34234 imageUploaded,people.jpg,more,comma,separated,stuff
这更简单,如果&#34; people.jpg&#34;始终遵循&#34; imageUploaded&#34;
str_extract(x,"imageUploaded.*people\\.jpg")