2013-02-18 32 views
11

Tôi có từ khóa (ví dụ: 'xanh lục') và một số văn bản ("Tôi không thích chúng Sam I Am!").R - đếm các kết hợp giữa các ký tự của một chuỗi và chuỗi khác, không thay thế

Tôi muốn xem có bao nhiêu ký tự trong từ khóa ('g', 'r', 'e', ​​'e', ​​'n') xuất hiện trong văn bản (theo thứ tự bất kỳ).

Trong ví dụ này, câu trả lời là 3 - văn bản không có một G hoặc R nhưng có hai Es và N.

Vấn đề của tôi phát sinh mà nếu một nhân vật trong văn bản là phù hợp với một nhân vật trong từ khóa, sau đó nó không thể sử dụng để khớp với một ký tự khác trong từ khóa. Ví dụ: nếu từ khóa của tôi là 'greeen', số "ký tự trùng khớp" vẫn là 3 (một N và hai Es) vì chỉ có hai chữ Es trong văn bản, chứ không phải 3 (để khớp với chữ cái thứ ba E). trong từ khóa).

Tôi có thể viết điều này bằng R như thế nào? Điều này chỉ là đánh dấu một cái gì đó ở rìa của bộ nhớ của tôi - Tôi cảm thấy như đó là một vấn đề phổ biến nhưng chỉ được diễn đạt khác nhau (giống như lấy mẫu không thay thế, nhưng "phù hợp với không có thay thế"?).

Ví dụ:

keyword <- strsplit('greeen', '')[[1]] 
text <- strsplit('idonotlikethemsamiam', '')[[1]] 
# how many characters in keyword have matches in text, 
# with no replacement? 
# Attempt 1: sum(keyword %in% text) 
# PROBLEM: returns 4 (all three Es match, but only two in text) 

Nhiều ví dụ về dự kiến ​​đầu vào/đầu ra (từ khóa, văn bản, sản lượng dự kiến):

  • 'xanh', 'idonotlikethemsamiam', 3 (G, E, E)
  • 'greeen ', 'idonotlikethemsamiam', 3 (G, E, E)
  • 'đỏ', 'idonotlikethemsamiam', 2 (E và D)

Trả lời

13

Chức năng pmatch() là điều tuyệt vời cho việc này. Mặc dù nó sẽ là bản năng để sử dụng chiều dài ở đây, chiều dài không có tùy chọn na.rm. Vì vậy, để làm việc xung quanh phiền toái này, sum (! Is.na()) được sử dụng.

keyword <- unlist(strsplit('greeen', '')) 
text <- unlist(strsplit('idonotlikethemsamiam', '')) 

sum(!is.na(pmatch(keyword, text))) 

# [1] 3 

keyword2 <- unlist(strsplit("red", '')) 
sum(!is.na(pmatch(keyword2, text))) 

# [1] 2 
+2

+1: Tôi chắc chắn đã học được điều gì đó ngay hôm nay! – Simon

+2

+1, thực sự, rất trơn tru –

+0

Aha! Tôi đã dành lứa tuổi cố gắng 'match' và' charmatch' và không nhận thấy rằng 'pmatch' đã không cho phép bản sao (chính xác những gì tôi muốn). Cảm ơn rất nhiều! –

-1

có lẽ bạn đang tìm kiếm để tìm các thành phần UNIQUE của từ khóa của bạn? Hãy thử:

keyword <- unique(strsplit('greeen','')[[1]]) 
+0

không, tôi không có. Tôi đang cố gắng tìm số * của các ký tự trong từ khóa xuất hiện trong văn bản, trong đó nếu một ký tự từ văn bản khớp với từ trong từ khóa, nó không thể được sử dụng để khớp với một ký tự khác từ từ khóa. Sản lượng mong muốn của tôi là ** số **, không phải là vectơ ký tự. –

Các vấn đề liên quan