Hầu hết các động từ dplyr sử dụng đánh giá gọn gàng theo một cách nào đó. Đánh giá ngăn nắp là một loại đánh giá phi tiêu chuẩn đặc biệt được sử dụng trong toàn bộ ngăn nắp. Có hai hình thức cơ bản được tìm thấy trong dplyr
Để xác định xem một đối số hàm có sử dụng mặt nạ dữ liệu hoặc lựa chọn gọn gàng hay không, hãy xem tài liệu. trong danh sách đối số, bạn sẽ thấy
starwars %>% filter[homeworld == "Naboo", species == "Human"]
5 hoặc starwars %>% filter[homeworld == "Naboo", species == "Human"]
5Mặt nạ dữ liệu và lựa chọn gọn gàng làm cho việc khám phá dữ liệu tương tác trở nên nhanh chóng và linh hoạt, nhưng chúng thêm một số thách thức mới khi bạn cố gắng sử dụng chúng một cách gián tiếp, chẳng hạn như trong vòng lặp for hoặc hàm. Họa tiết này chỉ cho bạn cách vượt qua những thử thách đó. Trước tiên, chúng tôi sẽ xem xét các khái niệm cơ bản về che giấu dữ liệu và lựa chọn gọn gàng, nói về cách sử dụng chúng một cách gián tiếp, sau đó chỉ cho bạn một số công thức để giải quyết các vấn đề phổ biến
Mô tả chi tiết này sẽ cung cấp cho bạn kiến thức tối thiểu cần thiết để trở thành một lập trình viên hiệu quả với cách đánh giá gọn gàng. Nếu bạn muốn tìm hiểu thêm về lý thuyết cơ bản hoặc chính xác nó khác với đánh giá không theo tiêu chuẩn như thế nào, chúng tôi khuyên bạn nên đọc các chương Lập trình siêu dữ liệu trong R nâng cao
Mặt nạ dữ liệu
Mặt nạ dữ liệu giúp thao tác dữ liệu nhanh hơn vì nó yêu cầu gõ ít hơn. Trong hầu hết [nhưng không phải tất cả] các hàm cơ sở R, bạn cần tham khảo các biến có
starwars %>% filter[homeworld == "Naboo", species == "Human"]
0, dẫn đến mã lặp lại tên của khung dữ liệu nhiều lầnstarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
Mã dplyr tương đương với mã này ngắn gọn hơn vì mặt nạ dữ liệu cho phép bạn chỉ cần nhập
starwars %>% filter[homeworld == "Naboo", species == "Human"]
1 một lầnstarwars %>% filter[homeworld == "Naboo", species == "Human"]
Biến dữ liệu và env
Ý tưởng chính đằng sau việc che dấu dữ liệu là nó làm mờ ranh giới giữa hai nghĩa khác nhau của từ “biến”
biến env là biến "lập trình" sống trong môi trường. Chúng thường được tạo bằng
2starwars %>% filter[homeworld == "Naboo", species == "Human"]
biến dữ liệu là các biến "thống kê" sống trong khung dữ liệu. Chúng thường đến từ các tệp dữ liệu [e. g.
3,starwars %>% filter[homeworld == "Naboo", species == "Human"]
4] hoặc được tạo bằng thao tác với các biến hiện cóstarwars %>% filter[homeworld == "Naboo", species == "Human"]
Để làm cho những định nghĩa đó cụ thể hơn một chút, hãy lấy đoạn mã này
Nó tạo một biến env,
starwars %>% filter[homeworld == "Naboo", species == "Human"]
5, chứa hai biến dữ liệu, starwars %>% filter[homeworld == "Naboo", species == "Human"]
6 và starwars %>% filter[homeworld == "Naboo", species == "Human"]
7. Sau đó, nó trích xuất biến dữ liệu starwars %>% filter[homeworld == "Naboo", species == "Human"]
6 ra khỏi biến env starwars %>% filter[homeworld == "Naboo", species == "Human"]
5 bằng cách sử dụng starwars %>% filter[homeworld == "Naboo", species == "Human"]
0Tôi nghĩ rằng việc làm mờ ý nghĩa của "biến" này là một tính năng thực sự hay để phân tích dữ liệu tương tác vì nó cho phép bạn tham khảo nguyên trạng các biến dữ liệu mà không cần bất kỳ tiền tố nào. Và điều này có vẻ khá trực quan vì nhiều người dùng R mới hơn sẽ cố gắng viết
starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
31Thật không may, lợi ích này không đến miễn phí. Khi bạn bắt đầu lập trình với những công cụ này, bạn sẽ phải vật lộn với sự khác biệt. Điều này sẽ khó vì bạn chưa bao giờ phải nghĩ về nó trước đây, vì vậy sẽ mất một thời gian để bộ não của bạn học các khái niệm và danh mục mới này. Tuy nhiên, một khi bạn đã phân tách khái niệm “biến” thành biến dữ liệu và biến env, tôi nghĩ bạn sẽ thấy nó khá đơn giản để sử dụng
gián tiếp
Thách thức chính của lập trình với các chức năng sử dụng mặt nạ dữ liệu phát sinh khi bạn giới thiệu một số hướng dẫn, tôi. e. khi bạn muốn lấy biến dữ liệu từ biến env thay vì gõ trực tiếp tên biến dữ liệu. Có hai trường hợp chính
Khi bạn có biến dữ liệu trong một đối số hàm [i. e. một biến env chứa đựng một lời hứa], bạn cần nắm lấy đối số bằng cách bao quanh nó trong dấu ngoặc kép, như
32starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
Hàm sau đây sử dụng ôm để tạo một trình bao bọc xung quanh
33 tính toán các giá trị tối thiểu và tối đa của một biến, cũng như số lượng quan sát đã được tóm tắtstarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
Khi bạn có một biến env là một vectơ ký tự, bạn cần lập chỉ mục cho đại từ
34 vớistarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
35, chẳng hạn nhưstarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
36starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
Ví dụ sau sử dụng
34 để đếm số lượng giá trị duy nhất trong mỗi biến củastarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
38starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
Lưu ý rằng
34 không phải là khung dữ liệu; . Đừng mong đợi các chức năng khác hoạt động với nóstarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
lựa chọn gọn gàng
Mặt nạ dữ liệu giúp dễ dàng tính toán các giá trị trong tập dữ liệu. Lựa chọn gọn gàng là một công cụ bổ sung giúp dễ dàng làm việc với các cột của tập dữ liệu
DSL gọn gàng
Bên dưới tất cả các chức năng sử dụng lựa chọn gọn gàng là gói cleanselect. Nó cung cấp một ngôn ngữ dành riêng cho miền thu nhỏ giúp dễ dàng chọn các cột theo tên, vị trí hoặc loại. Ví dụ
22 chọn cột đầu tiên;starwars %>% filter[homeworld == "Naboo", species == "Human"]
24 chọn các cộtstarwars %>% filter[homeworld == "Naboo", species == "Human"]
25,starwars %>% filter[homeworld == "Naboo", species == "Human"]
26 vàstarwars %>% filter[homeworld == "Naboo", species == "Human"]
27starwars %>% filter[homeworld == "Naboo", species == "Human"]
________ 228 chọn tất cả các cột có tên bắt đầu bằng “a”;
20 chọn tất cả các cột sốstarwars %>% filter[homeworld == "Naboo", species == "Human"]
Bạn có thể xem thêm chi tiết trong
starwars %>% filter[homeworld == "Naboo", species == "Human"]
21gián tiếp
Đối với mặt nạ dữ liệu, lựa chọn gọn gàng làm cho một tác vụ phổ biến trở nên dễ dàng hơn với chi phí làm cho một tác vụ ít phổ biến hơn trở nên khó khăn hơn. Khi bạn muốn sử dụng lựa chọn gọn gàng gián tiếp với đặc tả cột được lưu trữ trong một biến trung gian, bạn sẽ cần tìm hiểu một số công cụ mới. Một lần nữa, có hai hình thức gián tiếp
Khi bạn có biến dữ liệu trong biến env là đối số của hàm, bạn sử dụng kỹ thuật tương tự như mặt nạ dữ liệu. bạn chấp nhận đối số bằng cách bao quanh nó trong dấu ngoặc kép
Hàm sau tóm tắt khung dữ liệu bằng cách tính giá trị trung bình của tất cả các biến do người dùng chọn
Khi bạn có một biến env là một vectơ ký tự, bạn cần sử dụng
22 hoặcstarwars %>% filter[homeworld == "Naboo", species == "Human"]
23 tùy thuộc vào việc bạn muốn hàm báo lỗi nếu không tìm thấy biếnstarwars %>% filter[homeworld == "Naboo", species == "Human"]
Đoạn mã sau sử dụng
22 để chọn tất cả các biến được tìm thấy trong một vectơ ký tự;starwars %>% filter[homeworld == "Naboo", species == "Human"]
cách làm
Các ví dụ sau đây giải quyết một loạt các vấn đề phổ biến. Chúng tôi chỉ cho bạn số lượng mã tối thiểu để bạn có thể nắm được ý tưởng cơ bản;
Dữ liệu do người dùng cung cấp
Nếu bạn kiểm tra tài liệu, bạn sẽ thấy rằng
starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
34 không bao giờ sử dụng mặt nạ dữ liệu hoặc chọn gọn gàng. Điều đó có nghĩa là bạn không cần phải làm bất cứ điều gì đặc biệt trong chức năng của mìnhstarwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
3Loại bỏ starwars %>% filter[homeworld == "Naboo", species == "Human"]
28 starwars %>% filter[homeworld == "Naboo", species == "Human"]
29s
starwars %>% filter[homeworld == "Naboo", species == "Human"]
starwars %>% filter[homeworld == "Naboo", species == "Human"]
Nếu bạn đang viết một gói và bạn có một hàm sử dụng biến dữ liệu
Bạn sẽ nhận được một
starwars %>% filter[homeworld == "Naboo", species == "Human"]
30 starwars %>% filter[homeworld == "Naboo", species == "Human"]
29starwars %>% filter[homeworld == "Naboo", species == "Human"]
2Bạn có thể loại bỏ điều này bằng cách sử dụng
starwars %>% filter[homeworld == "Naboo", species == "Human"]
32 và nhập starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
34 từ nguồn của nó trong gói rlang [gói cơ bản thực hiện đánh giá gọn gàng]Một hoặc nhiều biểu thức do người dùng cung cấp
Nếu bạn muốn người dùng cung cấp một biểu thức được truyền vào một đối số sử dụng mặt nạ dữ liệu hoặc chọn gọn gàng, hãy chấp nhận đối số
Điều này khái quát một cách đơn giản nếu bạn muốn sử dụng một biểu thức do người dùng cung cấp ở nhiều nơi
Nếu bạn muốn người dùng cung cấp nhiều biểu thức, hãy nắm lấy từng biểu thức đó
starwars %>% filter[homeworld == "Naboo", species == "Human"]
2Nếu bạn muốn sử dụng tên của các biến trong đầu ra, bạn có thể sử dụng cú pháp keo kết hợp với
starwars %>% filter[homeworld == "Naboo", species == "Human"]
34starwars %>% filter[homeworld == "Naboo", species == "Human"]
3Bất kỳ số lượng biểu thức nào do người dùng cung cấp
Nếu bạn muốn lấy số lượng biểu thức do người dùng cung cấp tùy ý, hãy sử dụng
starwars %>% filter[homeworld == "Naboo", species == "Human"]
35. Điều này thường hữu ích nhất khi bạn muốn cấp cho người dùng toàn quyền kiểm soát một phần duy nhất của quy trình, chẳng hạn như starwars %>% filter[homeworld == "Naboo", species == "Human"]
36 hoặc starwars %>% filter[homeworld == "Naboo", species == "Human"]
37starwars %>% filter[homeworld == "Naboo", species == "Human"]
4Khi bạn sử dụng
starwars %>% filter[homeworld == "Naboo", species == "Human"]
35 theo cách này, hãy đảm bảo rằng bất kỳ đối số nào khác bắt đầu bằng starwars %>% filter[homeworld == "Naboo", species == "Human"]
39 để giảm khả năng xung đột đối số; . //thiết kế. ngăn nắp. org/dots-prefix. html để biết thêm chi tiếtChuyển đổi các biến do người dùng cung cấp
Nếu bạn muốn người dùng cung cấp một tập hợp các biến dữ liệu sau đó được chuyển đổi, hãy sử dụng
starwars %>% filter[homeworld == "Naboo", species == "Human"]
40starwars %>% filter[homeworld == "Naboo", species == "Human"]
8Bạn có thể sử dụng cùng một ý tưởng này cho nhiều bộ biến dữ liệu đầu vào
Sử dụng đối số
starwars %>% filter[homeworld == "Naboo", species == "Human"]
41 thành starwars %>% filter[homeworld == "Naboo", species == "Human"]
40 để kiểm soát tên của đầu raLặp lại nhiều biến
Nếu bạn có một vectơ ký tự tên biến và muốn thao tác trên chúng bằng vòng lặp for, hãy lập chỉ mục vào đại từ đặc biệt
starwars[starwars$homeworld == "Naboo" & starwars$species == "Human", ,]
34Kỹ thuật tương tự này hoạt động với các lựa chọn thay thế cho vòng lặp như họ cơ sở R
starwars %>% filter[homeworld == "Naboo", species == "Human"]
44 và họ starwars %>% filter[homeworld == "Naboo", species == "Human"]
45 purrrSử dụng một biến từ đầu vào Shiny
Nhiều điều khiển đầu vào Shiny trả về các vectơ ký tự, vì vậy bạn có thể sử dụng phương pháp tương tự như trên.
starwars %>% filter[homeworld == "Naboo", species == "Human"]
46