tra-loi-cau-hoi-phat-trien-web.com

Khớp mẫu bằng ký tự đại diện

Làm cách nào để xác định chuỗi bằng ký tự đại diện?

Tôi đã tìm thấy glob2rx, nhưng tôi không hiểu cách sử dụng nó. Tôi đã thử sử dụng đoạn mã sau để chọn các hàng của khung dữ liệu bắt đầu bằng Word blue:

# make data frame
a <- data.frame( x =  c('red','blue1','blue2', 'red2'))

# 1
result <- subset(a, x == glob2rx("blue*") )

# 2
test = ls(pattern = glob2rx("blue*"))
result2 <- subset(a, x == test )

# 3
result3 <- subset(a, x == pattern("blue*") )

Tuy nhiên, cả hai đều không hoạt động. Tôi không chắc mình có nên sử dụng một chức năng khác để thử và thực hiện việc này không.

37
djq

Nếu bạn muốn kiểm tra các phần tử bên trong một khung dữ liệu, bạn không nên sử dụng ls() mà chỉ nhìn vào tên của các đối tượng trong không gian làm việc hiện tại (hoặc nếu được sử dụng bên trong một hàm trong môi trường hiện tại). Tên trò chơi hoặc các phần tử bên trong các đối tượng như vậy không hiển thị với ls() (trừ khi tất nhiên bạn thêm một đối số môi trường vào lệnh gọi ls(.)-). Hãy thử sử dụng grep() là hàm workhorse để khớp mẫu của các vectơ ký tự:

result <- a[ grep("blue", a$x) , ]  # Note need to use `a$` to get at the `x`

Nếu bạn muốn sử dụng tập hợp con thì hãy xem xét hàm liên quan chặt chẽ grepl() trả về một vectơ logic có thể được sử dụng trong đối số tập hợp con:

subset(a, grepl("blue", a$x))
      x
2 blue1
3 blue2

Chỉnh sửa: Thêm một cách sử dụng "thích hợp" của global2rx trong tập hợp con ():

result <- subset(a,  grepl(glob2rx("blue*") , x) )
result
      x
2 blue1
3 blue2

Tôi không nghĩ rằng tôi thực sự hiểu glob2rx Cho đến khi tôi quay lại câu hỏi này. (Tôi đã hiểu các vấn đề phạm vi vốn là gốc rễ của những khó khăn của người hỏi. Bất kỳ ai đang đọc bài này bây giờ nên cuộn xuống câu trả lời của Gavin và nêu lên nó.)

41
42-

glob2rx() chuyển đổi một mẫu bao gồm ký tự đại diện thành biểu thức chính quy tương đương. Sau đó, bạn cần chuyển biểu thức chính quy này vào một trong các công cụ khớp mẫu của R.

Nếu bạn muốn khớp "blue*" Trong đó * Có ký tự đại diện thông thường, không biểu thức chính quy, nghĩa là chúng tôi sử dụng glob2rx() để chuyển đổi mẫu ký tự đại diện thành một biểu thức chính quy hữu ích:

> glob2rx("blue*")
[1] "^blue"

Đối tượng trả về is một biểu thức chính quy.

Đưa ra dữ liệu của bạn:

x <- c('red','blue1','blue2', 'red2')

chúng ta có thể khớp mẫu bằng cách sử dụng grep() hoặc các công cụ tương tự:

> grx <- glob2rx("blue*")
> grep(grx, x)
[1] 2 3
> grep(grx, x, value = TRUE)
[1] "blue1" "blue2"
> grepl(grx, x)
[1] FALSE  TRUE  TRUE FALSE

Đối với vấn đề chọn hàng bạn đã đăng

> a <- data.frame(x =  c('red','blue1','blue2', 'red2'))
> with(a, a[grepl(grx, x), ])
[1] blue1 blue2
Levels: blue1 blue2 red red2
> with(a, a[grep(grx, x), ])
[1] blue1 blue2
Levels: blue1 blue2 red red2

hoặc thông qua subset():

> with(a, subset(a, subset = grepl(grx, x)))
      x
2 blue1
3 blue2

Hy vọng rằng giải thích grob2rx() làm gì và làm thế nào để sử dụng nó?

32
Gavin Simpson

Bạn đang đi đúng hướng - từ khóa bạn nên tìm kiếm là Biểu thức thông thường. R không hỗ trợ chúng theo cách trực tiếp hơn cách này bằng cách sử dụng grep() và một vài lựa chọn thay thế khác.

Đây là một cuộc thảo luận chi tiết: http://www.THER-expressions.info/rl Language.html

4
Brian MacKay

Bạn cũng có thể sử dụng gói data.table và chức năng Like của nó, chi tiết được cung cấp bên dưới Cách chọn R data.table hàng dựa trên khớp chuỗi con (giống như SQL)

2
usct01

Nếu bạn thực sự muốn sử dụng ký tự đại diện để xác định các biến cụ thể, thì bạn có thể sử dụng kết hợp ls()grep() như sau:

l = ls()
vars.with.result <- l[grep("result", l)]

2
Brian D