2010-08-22 25 views
15

Không chắc chắn cách khác để hỏi điều này nhưng, tôi muốn tìm kiếm cụm từ trong một số phần tử chuỗi. Đây là những gì mã của tôi trông như thế (nhưng sai):Tương đương R của câu lệnh LIKE 'description%' của SQL là gì?

inplay = vector(length=nrow(des)) 
for (ii in 1:nrow(des)) { 
if (des[ii] = 'In play%') 
    inplay[ii] = 1 
else inplay[ii] = 0 
} 

des là một vector mà các cửa hàng chuỗi như "Swinging Strike", "Trong vở kịch (chạy (s))", "Trong vở kịch (trong (s) và vv Những gì tôi muốn inplay để lưu trữ là 1s và 0s vector tương ứng với des vector, với 1s inplay chỉ ra rằng giá trị des có "In play%" trong nó và 0s nếu không.

Tôi tin rằng dòng thứ ba là không chính xác, bởi vì tất cả điều này là trả về một vectơ 0 bằng 1 trong phần tử cuối cùng.

Cảm ơn trước!

+0

Bạn muốn 'startsWith'? –

Trả lời

14

R analog để NHƯ SQL của chỉ là cú pháp lập chỉ mục thông thường R.

Nhà điều hành 'LIKE' chọn hàng dữ liệu từ một bảng bằng cách kết hợp các giá trị chuỗi trong một cột được chỉ định đối với một mô hình người dùng cung cấp

> # create a data frame having a character column 
> clrs = c("blue", "black", "brown", "beige", "berry", "bronze", "blue-green", "blueberry") 
> dfx = data.frame(Velocity=sample(100, 8), Colors=clrs) 
> dfx 
      Velocity Colors 
     1  90  blue 
     2  94  black 
     3  71  brown 
     4  36  beige 
     5  75  berry 
     6  2  bronze 
     7  89 blue-green 
     8  93 blueberry 

> # create a pattern to use (the same as you would do when using the LIKE operator) 
> ptn = '^be.*?' # gets beige and berry but not blueberry 
> # execute a pattern-matching function on your data to create an index vector 
> ndx = grep(ptn, dfx$Colors, perl=T) 
> # use this index vector to extract the rows you want from the data frome: 
> selected_rows = dfx[ndx,] 
> selected_rows 
    Velocity Colors 
    4  36 beige 
    5  75 berry 

Trong SQL, đó sẽ là:

SELECT * FROM dfx WHERE Colors LIKE ptn3 
+0

Tại sao bạn quấn 'grep()' bằng 'fnx'? – Vince

+0

tôi ban đầu có trong tâm trí một chức năng mà lấy khung dữ liệu như một đối số, chứ không chỉ là một vector 1D. Trong mọi trường hợp, chỉnh sửa để loại bỏ hàm wrapper. – doug

+0

Điều này làm việc, nhưng giả sử tôi muốn lưu trữ 1 trong inlay vector nếu số hàng được chứa trong ndx, và một 0 nếu không, nơi chiều dài của inplay vector là chiều dài của dfx. Làm thế nào để tôi đi về điều này? Tôi đang chơi với các câu lệnh IF và ELSE nhưng tôi không làm việc này. Cảm ơn trước! –

2

Thứ gì đó như regexpr?

> d <- c("Swinging Strike", "In play (run(s))", "In play (out(s) recorded)") 
> regexpr('In play', d) 
[1] -1 1 1 
attr(,"match.length") 
[1] -1 7 7 
> 

hoặc grep

> grep('In play', d) 
[1] 2 3 
> 
16

data.tablepackage có cú pháp thường là similar to SQL. Gói này bao gồm %like%, đó là "chức năng tiện lợi để gọi regexpr". Dưới đây là ví dụ được lấy từ tệp trợ giúp của nó:

## Create the data.table: 
DT = data.table(Name=c("Mary","George","Martha"), Salary=c(2,3,4)) 

## Subset the DT table where the Name column is like "Mar%": 
DT[Name %like% "^Mar"] 
##  Name Salary 
## 1: Mary  2 
## 2: Martha  4 
Các vấn đề liên quan