2015-06-04 19 views
6

Tôi muốn xác định xem cột chuỗi trong khung dữ liệu dưới đây lặp lại các chữ "V" hoặc "G" ít nhất 5 lần trong 20 ký tự đầu tiên của chuỗi.Xác định chuỗi chữ cụ thể liên tục trong chuỗi bằng cách sử dụng R

mẫu dữ liệu:

data = data.frame(class = c('a','b','C'), string = 
c("ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ", 
"AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD", 
"GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER")) 

Ví dụ chuỗi trong hàng đầu tiên có "VVVVG" trong vòng 20 vị trí ký tự đầu tiên. Tương tự, chuỗi trong hàng thứ ba có "VVGGV".

data 
# class             string 
#1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ 
#2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD 
#3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER 

Kết quả mong muốn sẽ giống như thế này:

# class             string result 
# 1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ TRUE 
# 2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD FALSE 
# 3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER TRUE 
+2

lẽ '$ kết quả dữ liệu <- grepl ('(V | G) {5,}', substr (dữ liệu $ string, 1,20))' – akrun

+0

Cảm ơn @akrun nó hoạt động tốt –

+0

Điều gì sẽ xảy ra nếu chỉ có 'VVVVV' và không phải bất kỳ 'G' nào trong 20 ký tự đầu tiên – akrun

Trả lời

5

Tương tự như Akrun của

transform(data, result=grepl("[VG]{5,}", substr(string, 1, 20))) 

Tạo

class             string result 
1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ TRUE 
2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD FALSE 
3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER TRUE 

Ở đây chúng ta sử dụng grep kết hợp với một lớp nhân vật mà kết quả phù hợp hoặc "G" hoặc "V" ([VG]) lặp lại 5 lần hoặc nhiều hơn ({5, }). transform chỉ tạo khung dữ liệu mới với cột được thêm hoặc sửa đổi.


EDIT: một số tiêu chuẩn đối với câu trả lời sáng tạo của Matthew:

set.seed(1) 
string <- vapply(
    replicate(1e5, sample(c("V", "G", "A", "S"), sample(20:300, 1), rep=T)), 
    paste0, character(1L), collapse="" 
) 
library(microbenchmark) 
microbenchmark(
    grepl("[VG]{5,}", substr(string, 1, 20)), 
    grepl("^.{,15}[VG]{5,}", string), 
    times=10 
) 

Tạo:

Unit: milliseconds 
            expr  min  lq  mean 
grepl("[VG]{5,}", substr(string, 1, 20)) 131.6668 131.8343 133.6644 
     grepl("^.{,15}[VG]{5,}", string) 299.7326 300.4416 302.5065 

Chẳng phải hoàn toàn chắc chắn những gì mong đợi, nhưng tôi đoán nó có ý nghĩa kể từ substr là rất đơn giản để áp dụng. Thời gian rất gần nếu mẫu có 5 lần lặp lại gần phía trước của chuỗi.

+0

Cảm ơn các tiêu chuẩn, rất hữu ích. –

4

Một lựa chọn khác, mà không substr:

within(data, result<-grepl('^.{,15}[VG]{5,}', string)) 
+1

thay thế tốt đẹp – BrodieG

+1

Tùy chọn rất tốt. – akrun

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