21

次のデータ フレームがあるとします。

User.Id    Tags
34234      imageUploaded,people.jpg,more,comma,separated,stuff
34234      imageUploaded
12345      people.jpg

「imageUploaded」と「people」の両方を含む行のみを取得するには、grep (またはその他のツール) を使用するにはどうすればよいですか? つまり、順序に関係なく、文字列「imageUploaded」および「people.jpg」を含む行のみを含むサブセットを作成するにはどうすればよいでしょうか。

私が試してみました:

data.people<-data[grep("imageUploaded|people.jpg",results$Tags),]
data.people<-data[grep("imageUploaded?=people.jpg",results$Tags),]

AND演算子はありますか?それとも、意図した結果を得るための別の方法でしょうか?

4

4 に答える 4

26

この回答のおかげで、この正規表現は機能しているようです。grepl()データ オブジェクトにインデックスを付ける論理を返す whichを使用します。正規表現の内部の仕組みを完全に理解しているとは言いませんが、関係なく:

x <- c("imageUploaded,people.jpg,more,comma,separated,stuff", "imageUploaded", "people.jpg")

grepl("(?=.*imageUploaded)(?=.*people\\.jpg)", x, perl = TRUE)
#-----
[1]  TRUE FALSE FALSE
于 2012-11-02T00:17:28.020 に答える
15

私は@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
于 2012-11-02T01:36:10.043 に答える
10

読みやすくするために、次のようにすることができます。

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"
于 2012-11-02T00:50:45.087 に答える