2014-04-03 41 views
80

Tôi phải lọc khung dữ liệu bằng cách sử dụng làm tiêu chí những hàng trong đó có chứa chuỗi RTB. Tôi đang sử dụng dplyr.Hàng lọc có chứa một chuỗi nhất định sử dụng dplyr

d.del <- df %.% 
    group_by(TrackingPixel) %.% 
    summarise(MonthDelivery = as.integer(sum(Revenue))) %.% 
    arrange(desc(MonthDelivery)) 

Tôi biết tôi có thể sử dụng chức năng filter trong dplyr nhưng tôi không chính xác làm thế nào để nói với nó để kiểm tra về nội dung của một chuỗi.

Cụ thể là tôi muốn kiểm tra nội dung trong cột TrackingPixel. Nếu chuỗi chứa nhãn RTB Tôi muốn xóa hàng khỏi kết quả.

+15

Tôi chưa bao giờ sử dụng 'dplyr', nhưng nhìn vào sự giúp đỡ trong '? Dplyr :: filter' tôi muốn đề nghị một cái gì đó như' lọc (df,! Grepl ("RTB", TrackingPixel)) 'có lẽ ? – thelatemail

+1

Điều này thực sự gần với những gì tôi muốn đạt được. Vấn đề duy nhất là duy trì các chuỗi đó bao gồm nhãn 'RTB' và không hiển thị các nhãn khác. – Gianluca

+0

Tôi chỉ cần chỉnh sửa ẩn, được sửa lại bằng cách thêm '!' Vào trước 'grepl' - thử lại lần nữa. – thelatemail

Trả lời

135

Câu trả lời cho câu hỏi đã được đăng bởi @latemail trong các nhận xét ở trên. Bạn có thể sử dụng biểu thức thông thường cho các đối số thứ hai và tiếp theo của filter như thế này:

dplyr::filter(df, !grepl("RTB",TrackingPixel)) 

Vì bạn chưa cung cấp dữ liệu gốc, tôi sẽ thêm một ví dụ đồ chơi sử dụng bộ mtcars dữ liệu. Hãy tưởng tượng bạn chỉ quan tâm đến những chiếc xe được sản xuất bởi Mazda hay Toyota.

mtcars$type <- rownames(mtcars) 
dplyr::filter(mtcars, grepl('Toyota|Mazda', type)) 

    mpg cyl disp hp drat wt qsec vs am gear carb   type 
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4  Mazda RX4 
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag 
3 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Toyota Corolla 
4 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Toyota Corona 

Nếu bạn muốn làm điều đó theo chiều ngược lại, cụ thể là không bao gồm Toyota và Mazda xe, lệnh filter trông như thế này:

dplyr::filter(mtcars, !grepl('Toyota|Mazda', type)) 
+0

nếu tên cột chứa khoảng trắng. như Pixel theo dõi. – MySchizoBuddy

+3

đảm bảo bạn đang sử dụng chức năng lọc từ gói dplyr, không phải gói thống kê – JHowIX

+2

@MySchizoBuddy: Nếu tên cột chứa khoảng trắng, bạn có thể chọn biến bằng cách sử dụng dấu gạch chéo ngược. Sửa đổi ví dụ trên: 'mtcars $ \' kiểu của tôi \ '<- rownames (mtcars)' và sau đó 'mtcars%>% filter (grepl ('Toyota | Mazda', \' kiểu của tôi \ '))' – alex23lemm

43

Chúng ta nên sử dụng thay stringr::str_detect() hơn base::grepl(). Xem Introduction to stringr để biết chi tiết về gói stringr.

library(tidyverse) 
library(stringr) 

mtcars$type <- rownames(mtcars) 
mtcars %>% 
    filter(str_detect(type, 'Toyota|Mazda')) 
# mpg cyl disp hp drat wt qsec vs am gear carb   type 
# 1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4  Mazda RX4 
# 2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag 
# 3 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Toyota Corolla 
# 4 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Toyota Corona 
+0

Điều này làm việc với regex quá! – HNSKD

+0

Tại sao stringr lại là lựa chọn tốt hơn grep? – CameronNemo

+0

@CameronNemo Các hàm được cung cấp bởi gói 'stringr' bắt đầu bằng tiền tố str_, làm cho mã dễ đọc hơn. Trong mã R hiện đại gần đây, bạn nên sử dụng stringr. – Keiku

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