5 album r & b hàng đầu mọi thời đại năm 2022
Show
Feature Photo: Everett Collection / Shutterstock.com Well, here we go again as we present our third article in our a series of perfect albums in a row. We started out with this series at three perfect albums in a row and now we’re at five perfect albums in a row. This one is a lot tougher than the first two. It’s also a bit shorter as they were fewer bands that ever released five perfect albums in a row. Now many people argue there is no such thing as a perfect album. We would argue they are wrong. Of course, it depends on how you define the word perfect. We defined the word perfect in rock ‘n’ roll as a great album in which most fans love every single song on the record. And of course, there could be one or two that aren’t as perfect as the rest of the songs, but are close enough. We hope you have fun with this one Five Perfect Albums In A Row RushRush was one of the bands that benefited immediately from the extra album added as leaving Moving Pictures off our four in a row list really hurt. 2112 – 1976A Farewell to Kings -1977Hemispheres – 1978Permanent Waves – 1980Moving Pictures – 1981MetallicaNot everyone loves Metallica’s 1991 album, but we think its great. Their first five albums are simply stunning metal masterpieces Kill ‘Em All (1983)Ride the Lightning – 1984Master of Puppets – 1986…And Justice for All – 1988Metallica – 1991The PoliceThe Police are the only band on this list in which their five perfect albums in a row also happen to be the only five studio albums the band ever released. That’s called a perfect studio album discography. Outlandos d’Amour (1978)Reggatta de Blanc (1979)Zenyatta Mondatta (1980)Ghost in the Machine (1981)Synchronicity (1983)The Rolling StonesThere are a couple of different places in the Stones catalog where one could count off five perfect albums in a row. However, we think this is the strongest five album stretch in the band’s history. # 1 – Beggars Banquet – 1968# 2 – Let It Bleed – 1969# 3 – Sticky Fingers – 1971# 4 – Exile on Main St. – 1972# 5 – Goats Head Soup – 1973The BeatlesYes, we know Magical Mystery Tour was released between Sgt. Pepper’s Lonely Hearts Club Band and The White Album. However, in the UK, Magical Mystery Tour was basically a double ep with only six songs. In the US, it was just a compilation of those UK songs and some instrumentals. So we have disqualified Magical Mystery Tour as a complete studio album, therefore, opening the door to The White Album becoming the Beatles Fifth Perfect album in a row. # 1 – Help! – 1965# 2 – Rubber Soul – 1965# 3 – Revolver -1966# 4 – Sgt. Pepper’s Lonely Hearts Club Band – 1967# 5 – The Beatles (The White Album) – 1968AerosmithTheir first five albums are legendary. Pure rock and roll proving them to be one of the greatest rock bands ever that debuted in the 1970s. Aerosmith – 1973Get Your Wings – 1974Toys in the Attic – 1975Rocks – 1976Draw The Line – 1977Elton JohnMadman Across The Water – 1971Honky Château (1972)Don’t Shoot Me I’m Only the Piano Player -1973Goodbye Yellow Brick Road – 1973Caribou -1974Billy JoelBilly Joel’s most underrated album in our opinion is his fifth perfect one in a row. The Nylon Curtain stands as his Sgt Pepper. The four albums that came before it are also spectacular. And the two before that will probably keep Billy Joel on this perfect series of lists for a while. Turnstiles -1976The Stranger -197752nd Street -1978Glass Houses – 1980The Nylon Curtain – 1982Led ZeppelinWe hate leaving out Physical Graffiti, but their first five albums are more than perfect, they serve as the soundtrack to so many of our lives….. Led Zeppelin – 1969Led Zeppelin II – 1969Led Zeppelin III – 1970Led Zeppelin IV – 1971Houses Of The Holy – 1973Bruce SpringsteenThe Wild, the Innocent & the E Street Shuffle -1973Born to Run -1975Darkness on the Edge of Town -1978The River -1980Nebraska – 1982Steely DanSteely Dan is another band that we could probably rate their entire catalog as perfect…well almost. Pretzel Logic – 1974Katy Lied -1975The Royal Scam – 1976Aja – 1977Gaucho – 1980Queen# 1 – Queen II -1974# 2 – Sheer Heart Attack – 1974# 3 – A Night At The Opera – 1975# 4 – A Day At The Races – 1976# 5 – News Of The World – 1977The Who Some people feel the Who By Numbers wasn’t a great album, I think looking back in time it really was. Tommy – 1969Live At Leeds – 1970Who’s Next – 1971Quadrophenia – 1973The Who By Numbers – 1975The Allman Brothers BandAlbums that defined a style of music that no one came close to matching. The Allman Brothers Band (1969)Idlewild South (1970)At Fillmore East (1971, live)Eat a Peach (1972, part live)Brothers and Sisters (1973)David BowieSo many great albums we could have started at many different places in hs catalog. Diamond Dogs (1974)Young Americans – 1975Station to Station – 1976Low – 1977“Heroes” – 1977and the rest…… The DoorsThe Doors -1967Strange Days -1967Waiting for the Sun -1968The Soft Parade -1969Morrison Hotel – 1970Stevie Ray VaughanTexas Flood (1983)Couldn’t Stand the Weather (1984)Soul to Soul (1985)Live Alive (1986)In Step (1989)ZZ TopTejas (1976) Degüello (1979) El Loco (1981) Eliminator (1983) Afterburner (1985) Blue Oyster CultBlue Öyster Cult (1972) Tyranny and Mutation (1973) Secret Treaties (1974) Agents of Fortune (1976) Spectres (1977) FoghatEnergized – 1974 Rock and Roll Outlaws -1974 Fool For The City -1975 Night Shift -1976 Foghat Live -1977 Creedence Clearwater RevivalBayou Country (1969) Green River (1969) Willy and the Poor Boys (1969) Cosmo’s Factory (1970) Pendulum (1970) YesThe Yes Album – 1971 Fragile – 1971 Close to the Edge – 1972 Tales from Topographic Oceans – 1973 Relayer – 1974 Joni MitchellBlue – 1971 For the Roses – 1972 Court and Spark – 1974 The Hissing of Summer Lawns -1975 Hejira – 1976 Black SabbathBlack Sabbath (1970) Paranoid (1970) Master of Reality (1971) Vol. 4 (1972) Sabbath Bloody Sabbath (1973) Frank ZappaOver-Nite Sensation -1973 Apostrophe (‘) -1974 Roxy & Elsewhere -1974 One Size Fits All – 1975 Bongo Fury -1975 AC/DCDirty Deeds Done Dirt Cheap (1976) Powerage (1978) Highway to Hell (1979) Back in Black (1980) For Those About to Rock We Salute You (1981) Grand Funk RailroadCloser to Home (1970) Survival (1971) E Pluribus Funk (1971) Phoenix (1972) We’re an American Band (1973) U2Boy – 1980 October -1981 War -1983 The Unforgettable Fire -1984 The Joshua Tree -1987 Classic Rock Bands That Released Five Perfect Albums In A Row article published on Classic RockHistory.com© 2022Classicrockhistory.com claims ownership of all its original content and Intellectual property under United States Copyright laws and those of all other foreign countries. No one person, business, or organization is allowed to re-publish any of our original content anywhere on the web or in print without our permission. All photos used are either public domain creative commons photos or licensed officially from Shutterstock under license with ClassicRockHistory.com. All photo credits have been placed at end of the article.
What is the 5 albums test?In 2011, back when I was a writer for The A.V. Club, I invented a game called The Five-Albums Test, in which I listed artists and bands that have at least five consecutive very good-to-great albums.
What is the #1 album right now 2022?Adele, '30'
What is Maroon 5's biggest hit?"One More Night" spent nine weeks at #1 on the Billboard Hot 100 and sold over four million copies making it Maroon 5's biggest hit. It also reached #1 at both mainstream and adult pop radio.
When did Maroon 5 break up?On March 9, 2012, Maroon 5 announced that Jesse Carmichael would take a break from performing with the group for an undetermined amount of time to focus more on his studies of "music and the healing arts" and was replaced by a new keyboardist and background vocalist PJ Morton, who had been touring with them since 2010 ...
Có nhiều từ để xử lý dữ liệu. Bạn có thể làm sạch, hack, thao túng, munge, tinh chỉnh và dọn dẹp bộ dữ liệu của bạn, sẵn sàng cho giai đoạn tiếp theo, điển hình là mô hình hóa và trực quan hóa. Mỗi từ nói điều gì đó về nhận thức đối với quy trình: Xử lý dữ liệu thường được coi là công việc bẩn thỉu, một sự cần thiết khó chịu phải chịu đựng trước khi công việc thực sự, thú vị và quan trọng bắt đầu. Nhận thức này là sai. Lấy dữ liệu của bạn ‘Ship Shape, là một đáng kính và trong một số trường hợp kỹ năng quan trọng. Vì lý do này, chúng tôi sử dụng nghề mộc dữ liệu có thuật ngữ đáng ngưỡng mộ hơn.clean, hack, manipulate, munge, refine and tidy your dataset, ready for the next stage, typically modelling and visualisation. Each word says something about perceptions towards the process: data processing is often seen as dirty work, an unpleasant necessity that must be endured before the real, fun and important work begins. This perception is wrong. Getting your data ‘ship shape’ is a respectable and in some cases vital skill. For this reason we use the more admirable term data carpentry. Phép ẩn dụ này không phải là tình cờ. Thợ mộc là quá trình lấy những miếng gỗ thô và làm việc với sự chăm sóc, siêng năng và chính xác để tạo ra một sản phẩm hoàn chỉnh. Một thợ mộc không hack vào gỗ một cách ngẫu nhiên. Anh ấy hoặc cô ấy sẽ kiểm tra nguyên liệu thô và chọn công cụ phù hợp cho công việc. Theo cách tương tự, nghề mộc dữ liệu là quá trình lấy thô, thô và ở một mức độ nào đó được sắp xếp ngẫu nhiên dữ liệu đầu vào và tạo dữ liệu được tổ chức và gọn gàng gọn gàng. Học kỹ năng của nghề mộc dữ liệu sớm sẽ mang lại lợi ích trong nhiều năm tới. Hãy cho tôi sáu giờ để chặt cây và tôi sẽ dành bốn lần làm sắc nét đầu tiên rìu như câu nói. Xử lý dữ liệu là một giai đoạn quan trọng trong bất kỳ dự án nào liên quan đến bất kỳ bộ dữ liệu nào từ các nguồn bên ngoài, tức là & nbsp; hầu hết các ứng dụng trong thế giới thực. Theo cùng một cách mà nợ kỹ thuật, được thảo luận trong Chương 5, có thể làm tê liệt quy trình làm việc của bạn, làm việc với dữ liệu lộn xộn có thể dẫn đến địa ngục quản lý dự án. May mắn thay, được thực hiện một cách hiệu quả, ngay từ đầu dự án của bạn (thay vì nửa chặng đường, khi có thể là quá muộn) và sử dụng các công cụ phù hợp, giai đoạn xử lý dữ liệu này có thể rất bổ ích. Quan trọng hơn từ góc độ hiệu quả, làm việc với dữ liệu sạch sẽ có lợi cho mọi giai đoạn tiếp theo của dự án R. Vì vậy, đối với các ứng dụng chuyên sâu về dữ liệu, đây có thể là chương quan trọng nhất của cuốn sách. Trong đó, chúng tôi đề cập đến các chủ đề sau:
Điều kiện tiên quyếtChương này phụ thuộc vào một số gói để làm sạch và xử lý dữ liệu - kiểm tra chúng được cài đặt trên máy tính của bạn và tải chúng với:
RSQLite và GGMAP cũng được sử dụng trong một vài ví dụ, mặc dù chúng không phải là trung tâm của nội dung chương. and ggmap are also used in a couple of examples, although they are not central to the chapter’s content. 5 lời khuyên hàng đầu cho nghề mộc dữ liệu hiệu quả
Khung dữ liệu hiệu quả với TibbleTibble là một gói xác định lớp khung dữ liệu mới cho r, 5. These ‘tibble diffs’ (as their inventor suggests
they should be pronounced) are like the base class 6, but with more user friendly printing, subsetting, and factor handling.Khung dữ liệu Tibble là một đối tượng S3 với ba lớp, 5, 8 và 6. Vì đối tượng có thẻ 6, điều này có nghĩa là nếu phương thức 5 hoặc 8 không có sẵn, đối tượng sẽ được truyền vào hàm 6 thích hợp.Để tạo khung dữ liệu tibbble, chúng tôi sử dụng hàm 4
Ví dụ trên minh họa sự khác biệt chính giữa cách tiếp cận của tibbble và cơ sở R với các khung dữ liệu:tibble and base R approach to data frames:
Những khác biệt khác có thể được tìm thấy trong trang trợ giúp liên quan - 9.Bạn có thể tạo một hàng khung dữ liệu Tibble bằng cách sử dụng hàm 0.Tập thể dụcTạo khung dữ liệu sau
Hãy thử và đoán đầu ra của các lệnh sau
Bây giờ tạo một khung dữ liệu tibbble và lặp lại các lệnh trên. TIDING DỮ LIỆU VỚI TIDYR VÀ Biểu thức chính quyMột kỹ năng quan trọng trong phân tích dữ liệu là hiểu cấu trúc của các bộ dữ liệu và có thể định hình lại chúng. Điều này rất quan trọng từ góc độ hiệu quả của quy trình công việc: Hơn một nửa thời gian phân tích dữ liệu có thể được dành để định dạng lại các bộ dữ liệu (H. Wickham 2014b), do đó, việc đưa nó trở thành một hình thức phù hợp sớm có thể tiết kiệm giờ trong tương lai. Chuyển đổi dữ liệu thành một hình thức ‘gọn gàng cũng có lợi từ góc độ hiệu quả tính toán: thường nhanh hơn để chạy phân tích và vẽ các lệnh trên dữ liệu gọn gàng.(H. Wickham 2014b), so getting it into a suitable form early could save hours in the future. Converting data into a ‘tidy’ form is also advantageous from a computational efficiency perspective: it is usually faster to run analysis and plotting commands on tidy data. Việc dọn dẹp dữ liệu bao gồm làm sạch dữ liệu và định hình lại dữ liệu. Làm sạch dữ liệu là quá trình định dạng lại và ghi nhãn dữ liệu lộn xộn. Các gói bao gồm Stringi và StringR có thể giúp cập nhật các chuỗi ký tự lộn xộn bằng cách sử dụng các biểu thức thông thường; Các gói xác nhận và Assertr có thể thực hiện kiểm tra chẩn đoán cho tính toàn vẹn của dữ liệu ngay từ đầu của dự án phân tích dữ liệu. Một tác vụ làm sạch dữ liệu phổ biến là việc chuyển đổi các chuỗi văn bản không chuẩn thành các định dạng ngày như được mô tả trong Vignette Lubridate (xem 1). Tuy nhiên, việc TIDING là một khái niệm rộng hơn, tuy nhiên, cũng bao gồm việc định hình lại dữ liệu để nó ở dạng có lợi hơn cho phân tích và mô hình hóa dữ liệu. Quá trình định hình lại được minh họa bằng Bảng 6.1 và 6.2, được cung cấp bởi H. Wickham (2014b) và được tải bằng mã bên dưới:stringi and stringr can help update messy character strings using regular expressions; assertive and assertr packages can perform diagnostic checks for data integrity at the outset of a data analysis project. A common data cleaning task is the conversion
of non-standard text strings into date formats as described in the lubridate vignette (see 1). Tidying is a broader concept, however, and also includes re-shaping data so that it is in a form more conducive to data analysis and modelling. The process of reshaping is illustrated by Tables 6.1 and
6.2, provided by H. Wickham (2014b) and loaded using the code below:
Bảng 6.1 và 6.2 hiển thị một tập hợp con của các bộ dữ liệu ‘rộng 2 và’ dài (gọn gàng) 3, tương ứng. Chúng có các kích thước khác nhau, nhưng chúng chứa chính xác cùng một thông tin. Tên cột trong mẫu ’rộng trong Bảng 6.1 đã trở thành một biến mới ở dạng‘ dài trong Bảng 6.2. Theo khái niệm về ‘dữ liệu gọn gàng, hình thức dài là chính xác. Lưu ý rằng ’đúng ở đây được sử dụng trong bối cảnh phân tích dữ liệu và trực quan hóa đồ họa. Vì R là ngôn ngữ dựa trên vector, dữ liệu gọn gàng cũng có lợi thế hiệu quả: nó thường nhanh hơn để hoạt động trên một vài cột dài hơn nhiều cột ngắn. Hơn nữa, các gói mạnh mẽ và hiệu quả DPPLE và GGPLOT2 được thiết kế xung quanh dữ liệu gọn gàng. Tuy nhiên, dữ liệu rộng là phổ biến có thể tiết kiệm không gian và phổ biến để trình bày trong các bảng tóm tắt, do đó, rất hữu ích để có thể chuyển giữa các định dạng rộng (hoặc không gọn gàng) và các định dạng gọn gàng.dplyr and ggplot2 were designed around tidy data. Wide data is common, however, can be space efficient and is common for presentation in summary tables, so it’s useful to be able to transfer between wide (or otherwise ‘untidy’) and tidy formats.Dữ liệu TIDY có các đặc điểm sau (H. Wickham 2014b):(H. Wickham 2014b):
Bởi vì chỉ có một đơn vị quan sát trong ví dụ (tôn giáo), nó có thể được mô tả trong một bảng duy nhất. Các bộ dữ liệu lớn và phức tạp thường được đại diện bởi nhiều bảng, với các định danh duy nhất hoặc ‘phím, để kết hợp chúng với nhau (CODD 1979).(Codd 1979). Hai hoạt động phổ biến được tạo điều kiện bởi TIDYR là thu thập và tách các cột.tidyr are gathering and splitting columns.
Làm cho các bảng rộng dài với pivot_longer(pew, -religion)
#> # A tibble: 162 x 3
#> religion name value
#> Xoay dài hơn có nghĩa là tạo ra các bảng rộng ’dài, bằng cách chuyển đổi tên cột thành một biến mới. Điều này được thực hiện với hàm 4 (nghịch đảo là 6). Quá trình này được minh họa trong Bảng 6.1 và 6.2 tương ứng. Mã thực hiện thao tác này được cung cấp trong khối mã bên dưới. Điều này chuyển đổi một bảng với 18 hàng và 10 cột thành bộ dữ liệu gọn gàng với 162 hàng và 3 cột (so sánh đầu ra với đầu ra của 2, được hiển thị ở trên):
Mã trên cho thấy ba đối số mà 4 yêu cầu:
Cũng như các chức năng khác trong ‘Tidyverse, tất cả các đối số được đưa ra bằng cách sử dụng tên trần, thay vì các chuỗi ký tự. Đối số 2 và 3 có thể được người dùng chỉ định và không có liên quan đến dữ liệu hiện có. Hơn nữa, một đối số bổ sung, được đặt là 2, đã được sử dụng để loại bỏ biến tôn giáo khỏi thu thập, đảm bảo rằng các giá trị trong cột này là cột đầu tiên trong đầu ra. Nếu không có đối số 2 được chỉ định, tất cả các tên cột được sử dụng trong khóa, có nghĩa là kết quả chỉ cần báo cáo tất cả 180 cặp cột/giá trị do tập dữ liệu đầu vào với 10 cột bằng 18 hàng:
Bảng 6.1: 3 hàng đầu tiên của bộ dữ liệu ‘Pew Pew từ Wickham (2014a) trong một hình thức‘ không gọn gàng.First 3 rows of the aggregated ‘pew’ dataset from Wickham (2014a) in an ‘untidy’ form.
Phật tửSplitting means taking a variable that is really two variables combined and creating two separate columns from it. A classic example is age-sex variables (e.g. 5 and 6 to represent males and females in the 0 to 10 age band). Splitting such variables can be done with the 4 function, as illustrated in the Tables
6.3 and 6.4 and in the code chunk below. See 8 for more information on this function.
Chia các biến khớp với 4Joined age and sex variables in one column
9.
M0-10F0-10tidyr can perform, as described in the package’s vignette ( 0). The wider issue of manipulation is a large topic with major potential implications for efficiency (Spector 2008) and
this section only covers some of the key operations. More important is understanding the principles behind converting messy data into standard output forms.Bảng 6.4: Các biến tuổi và giới tính được phân tách bằng hàm 9.broom package provides a standard output format for model results, easing interpretation (see the broom vignette). The function 1
can be applied to a wide range of model objects and return the model’s output in a standardized data frame output.Tình dụcdplyr and tidyr function names to allow the use of standard evaluation. Thus the standard evaluation version of 3 is 4.tuổi tácm(e.g. Sanchez 2013), so we’ll just scratch the surface of the topic, and provide a taster of what is possible. Regex is a deep topic. However, knowing the basics can save a huge amount of time from a data tidying perspective, by automating the cleaning of messy strings. 0-10stringr and base R ways of doing pattern matching. The former provides easy to remember function names and consistency. The latter is useful to know as you’ll find lots of base R regex code in other peoples code as stringr is relatively new and not installed by default. The foundational regex operation is to detect whether or not a particular text string exists in an element or not which is done with 5 and 6 in base R and stringr respectively:
fstringr does not include a direct replacement for 7. You can use 8 instead. Các chức năng Tidyr khácstringr functions: they all do. This can be efficient because if you want to do some regex work, you just need to type 0 and then hit Tab to see a list of all the options. The various base R regex function names, by contrast, are harder to remember, including 2, 3 and
4. The stringr equivalents have more intuitive names that relate to the intention of the functions: 5, 6 and 7, respectively.Có các hoạt động dọn dẹp khác mà Tidyr có thể thực hiện, như được mô tả trong gói họa tiết của gói ( 0). Vấn đề thao túng rộng hơn là một chủ đề lớn với ý nghĩa chính đối với hiệu quả (Spector 2008) và phần này chỉ bao gồm một số hoạt động chính. Quan trọng hơn là hiểu các nguyên tắc đằng sau việc chuyển đổi dữ liệu lộn xộn thành các hình thức đầu ra tiêu chuẩn.
Trong phần này, chúng tôi dạy cả hai cách kết hợp chuỗi và cơ sở R. Cái trước cung cấp dễ nhớ tên chức năng và tính nhất quán. Cái sau rất hữu ích để biết khi bạn sẽ tìm thấy rất nhiều mã R Regex cơ sở trong mã người khác vì StringR tương đối mới và không được cài đặt theo mặc định. Hoạt động Regex nền tảng là phát hiện liệu một chuỗi văn bản cụ thể có tồn tại trong một phần tử hay không được thực hiện với library("stringr")
x = c("Hi I'm Robin.", "DoB 1985")
grepl(pattern = "9", x = x)
#> [1] FALSE TRUE
str_detect(string = x, pattern = "9")
#> [1] FALSE TRUE library("stringr")
x = c("Hi I'm Robin.", "DoB 1985")
grepl(pattern = "9", x = x)
#> [1] FALSE TRUE
str_detect(string = x, pattern = "9")
#> [1] FALSE TRUE |
(các) hàm dplyr | Sự mô tả | Chức năng cơ sở R. |
---|---|---|
bộ lọc (), lát () | Các hàng tập hợp con theo thuộc tính (bộ lọc) hoặc vị trí (lát) | tập hợp con(), [ |
sắp xếp() | Trả về dữ liệu được đặt hàng theo (các) biến | gọi món() |
lựa chọn() | Cột tập hợp con | tập hợp con(), [, [[ |
đổi tên() | Đổi tên cột | colnames () |
riêng biệt() | Trả về các hàng độc đáo | ! trùng lặp () |
đột biến () | Tạo các biến mới (Transmute bỏ các biến hiện tại) | biến đổi(), [[ |
Tóm tắt () | Thu gọn dữ liệu thành một hàng | Tổng hợp (), Tapply () |
sample_n () | Trả về một mẫu dữ liệu | vật mẫu() |
Không giống như các chất tương tự R cơ sở, các chức năng xử lý dữ liệu DPPLYR, hoạt động một cách nhất quán. Mỗi hàm lấy một đối tượng khung dữ liệu làm đối số đầu tiên của nó và dẫn đến khung dữ liệu khác. Các biến có thể được gọi trực tiếp mà không cần sử dụng toán tử
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
04. DPPLYR được thiết kế để được sử dụng với toán tử library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
4 được cung cấp bởi gói Magrittr, cho phép từng giai đoạn xử lý dữ liệu được biểu diễn dưới dạng dòng mới. Điều này được minh họa trong đoạn mã bên dưới, tải một bộ dữ liệu phát thải khí nhà kính gọn gàng từ gói hiệu quả, sau đó xác định các quốc gia có sự tăng trưởng tuyệt đối lớn nhất trong khí thải từ năm 1971 đến 2012:dplyr’s data processing functions work in a consistent way. Each function takes a data frame object as its first argument and results in another data frame. Variables can be called directly without using the library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
04 operator. dplyr was designed to be used with the ‘pipe’ operator library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
4 provided by the magrittr package, allowing each data processing stage to be represented as a new
line. This is illustrated in the code chunk below, which loads a tidy country level dataset of greenhouse gas emissions from the efficient package, and then identifies the countries with the greatest absolute growth in emissions from 1971 to 2012:library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
1Kết quả, được minh họa trong Bảng 6.6, cho thấy Hoa Kỳ có mức tăng trưởng cao nhất và phát thải trung bình từ ngành vận tải, theo sát là Trung Quốc. Mục đích của đoạn mã này không dành cho bạn bằng cách nào đó đọc nó và hiểu nó: Đó là cung cấp một cú pháp độc đáo của DPPLY, được mô tả chi tiết hơn trong suốt thời gian của phần này.dplyr’s unique syntax, which is described in more detail throughout the duration of this section.
Bảng 6.6: 3 quốc gia hàng đầu về khí thải CO2 trung bình từ vận chuyển kể từ năm 1971 và tăng trưởng phát thải vận chuyển trong giai đoạn đó (MTCO2E/năm).The top 3 countries in terms of average CO2 emissions from transport since 1971, and growth in transport emissions over that period (MTCO2e/yr).Quốc gia | Bần tiện | Sự phát triển |
---|---|---|
Hoa Kỳ | 1462 | 709 |
Trung Quốc | 214 | 656 |
Ấn Độ | 85 | 170 |
Dựa trên ‘học bằng cách thực hiện đạo đức, phần còn lại của phần này hoạt động thông qua các chức năng này để xử lý và bắt đầu phân tích một bộ dữ liệu về sự bình đẳng kinh tế do Ngân hàng Thế giới cung cấp. Bộ dữ liệu đầu vào có thể được tải như sau:
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
2DPPLYR là một gói lớn và có thể được coi là một ngôn ngữ theo đúng nghĩa của nó. Theo nguyên tắc ‘Đi bộ trước khi bạn chạy nguyên tắc, chúng tôi sẽ bắt đầu đơn giản, bằng cách lọc và tổng hợp các hàng. is a large package and can be seen as a language in its own right. Following the ‘walk before you run’ principle, we’ll start simple, by filtering and aggregating rows.
Đổi tên cột
Đổi tên các cột dữ liệu là một nhiệm vụ phổ biến có thể làm cho mã viết nhanh hơn bằng cách sử dụng các tên ngắn, trực quan. Hàm DPPLYR
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
06 làm cho điều này dễ dàng.dplyr function library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
06 makes this easy.Lưu ý trong khối mã này, tên biến được bao quanh bởi các trích dẫn backs (
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
07). Điều này cho phép R tham khảo các tên cột không chuẩn. Cũng lưu ý cú pháp: library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
06 lấy khung dữ liệu làm đối tượng đầu tiên và sau đó tạo các biến mới bằng cách chỉ định library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
09.library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
3Để đổi tên nhiều cột, các tên biến được phân tách bằng dấu phẩy.
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
10 sẽ đổi tên các biến library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
11 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
12 trong bộ dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
13. Trong cơ sở r, hàm tương đương sẽ là library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
14 hoặc library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
15, giả sử chúng tôi đã xử lý các cột thứ nhất và thứ hai.Thay đổi các lớp cột
Lớp đối tượng R là rất quan trọng đối với hiệu suất. Nếu một lớp được chỉ định không chính xác (ví dụ: & nbsp; nếu các số được coi là yếu tố hoặc ký tự), điều này sẽ dẫn đến kết quả không chính xác. Lớp của tất cả các cột trong khung dữ liệu có thể được truy vấn bằng hàm
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
16 (viết tắt để hiển thị cấu trúc của một đối tượng) .14structure of an object).14Kiểm tra trực quan dữ liệu (ví dụ: & nbsp; thông qua
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
17) cho thấy rõ rằng tất cả các cột ngoại trừ 1 đến 4 (library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
18, library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
19, library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
20 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
21) nên được số. Lớp của các biến số có thể được thay đổi một-từng cái bằng cách sử dụng library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
22 như sau (sẽ đặt cột library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
23 thành lớp library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
24 nếu nó đã có): 15library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
4Tuy nhiên, mục đích của các ngôn ngữ lập trình là tự động hóa các tác vụ và giảm gõ. Chunk mã sau đây đảm bảo các biến số trong đối tượng
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
25 là library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
24 bằng cách sử dụng cùng một hàm (library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
27 là hàm trợ giúp để chọn các biến và cả các từ có hàm DPPLYR như library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
28 chọn tất cả các cột chứa chuỗi văn bản đã cho):dplyr functions such as library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
28 which select all columns containing a given text string):library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
5Một cách khác để đạt được kết quả tương tự là sử dụng
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
29, chuyển đổi khung dữ liệu thành số library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
30:library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
6Mỗi phương pháp (cơ sở r và dplyr) có giá trị của nó. Đối với những người đọc mới đến R, những người có kế hoạch sử dụng các gói Tidyverse khác, chúng tôi sẽ cung cấp một chút hướng tới
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
31 cho sự linh hoạt và cú pháp biểu cảm của nó. Các phương pháp khác để đạt được kết quả tương tự bao gồm việc sử dụng các vòng thông qua library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
32 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
33. Chúng được hiển thị trong mã nguồn chương.dplyr) has its merits. For readers new to R who plan to use other tidyverse packages we would provide a slight steer towards library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
31 for its flexibility and expressive syntax. Other methods for acheiving the same result include the use of loops via library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
32 and library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
33. These are shown in the chapter’s source code.Lọc hàng
DPPLYR cung cấp một cách thay thế để lọc dữ liệu, sử dụng
34. offers an alternative way of filtering data, using library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
34.library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
7library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
34 linh hoạt hơn một chút so với library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
36: library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
37 hoạt động cũng như library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
38 và có bất kỳ số lượng điều kiện nào (xem library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
39). library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
34 nhanh hơn một chút so với cơ sở r.16 Bằng cách tránh ký hiệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
04, DPPLYR làm cho mã tập hợp con thường ngắn gọn và phù hợp với các hàm DPPLYR khác. Đối số đầu tiên là khung dữ liệu và các tên biến thô tiếp theo có thể được coi là đối tượng vector: một tính năng xác định của dplyr. Trong phần tiếp theo, chúng tôi sẽ tìm hiểu làm thế nào cú pháp này có thể được sử dụng cùng với lệnh library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
4 ’đường ống để viết các lệnh thao tác dữ liệu rõ ràng.dplyr makes subsetting code
concise and consistent with other dplyr functions. The first argument is a data frame and subsequent raw variable names can be treated as vector objects: a defining feature of dplyr. In the next section we’ll learn how this syntax can be used alongside the library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
4 ‘pipe’ command to write clear data manipulation commands.Có tương đương DPPLYR của nhiều chức năng R cơ sở nhưng chúng thường hoạt động hơi khác nhau. Ví dụ, DPPLYR tương đương với
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
43 là sử dụng hàm nhóm library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
44 kết hợp với hàm mục đích chung library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
45 (không bị nhầm lẫn với library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
46 trong cơ sở r), như chúng ta sẽ thấy trong Phần 6.4.5.dplyr equivalents of many base R functions but these usually work slightly differently. The
dplyr equivalent of library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
43, for example is to use the grouping function library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
44 in combination with the general purpose function library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
45 (not to be confused with library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
46 in base R), as we shall see in Section 6.4.5.Chuỗi hoạt động
Một tính năng thú vị khác của DPPLE là khả năng hoạt động chuỗi của nó cùng nhau. Điều này khắc phục một trong những vấn đề thẩm mỹ với mã r: bạn có thể kết thúc với các lệnh rất dài với nhiều chức năng được lồng vào nhau để trả lời các câu hỏi tương đối đơn giản. Kết hợp với chức năng
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
47, các đường ống có thể giúp ngưng tụ hàng ngàn dòng dữ liệu thành một thứ gì đó có thể đọc được. Tại đây, cách bạn có thể sử dụng các chuỗi để tóm tắt các chỉ mục Gini trung bình mỗi thập kỷ, ví dụ:dplyr is its ability
to chain operations together. This overcomes one of the aesthetic issues with R code: you can end-up with very long commands with many functions nested inside each other to answer relatively simple questions. Combined with the library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
47 function, pipes can help condense thousands of lines of data into something human readable. Here’s how you could use the chains to summarize average Gini indexes per decade, for example:library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
8Thường thì cách tốt nhất để học là thử và phá vỡ một cái gì đó, vì vậy hãy thử chạy các lệnh trên với các động từ dplyr khác nhau. Bằng cách giải thích, đây là những gì đã xảy ra:dplyr verbs. By way of explanation, this is what happened:
- Chỉ các cột
20 vàlibrary("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
23 được chọn, sử dụnglibrary("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
50.library("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
- Một biến mới,
51 đã được tạo, để chỉ hiển thị các số liệu thập kỷ (ví dụ: & NBSP; 1989 trở thành năm 1980).library("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
- Biến mới này đã được sử dụng để nhóm các hàng trong khung dữ liệu với cùng một thập kỷ.
- Giá trị trung bình mỗi thập kỷ đã được tính toán, minh họa mức độ bất bình đẳng thu nhập trung bình là lớn nhất vào năm 1990 nhưng sau đó đã giảm nhẹ.
Hãy cùng hỏi một câu hỏi khác để xem làm thế nào quy trình làm việc chuỗi DPPLYR có thể được sử dụng để trả lời các câu hỏi tương tác: 5 năm không đồng đều nhất đối với các quốc gia có chứa chữ G là gì? Tại đây, cách thức các chuỗi có thể giúp tổ chức phân tích cần thiết để trả lời câu hỏi này từng bước:dplyr chaining workflow can be used to answer questions interactively: What are the 5 most unequal years for countries containing the letter g? Here’s how chains can help organise the analysis needed to answer this question step-by-step:
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
9Hàm trên bao gồm 6 giai đoạn, mỗi giai đoạn tương ứng với chức năng dòng mới và DPPLY:dplyr function:
- Lọc ra các quốc gia mà chúng tôi quan tâm (bất kỳ tiêu chí lựa chọn nào cũng có thể được sử dụng thay cho
52).library("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
- Nhóm sản lượng theo năm.
- Tóm tắt, cho mỗi năm, chỉ số Gini trung bình.
- Sắp xếp kết quả bằng chỉ số Gini trung bình
- Chỉ chọn 5 năm không đồng đều nhất.
Để xem lý do tại sao phương pháp này được ưu tiên hơn so với phương pháp chức năng lồng nhau, hãy xem phương pháp sau. Ngay cả sau khi thụt lề đúng cách, nó trông khủng khiếp và gần như không thể hiểu được!
df_base = data.frame(colA = "A")
0Phần này chỉ cung cấp một kỹ năng hơn về những gì có thể có và tại sao nó có ý nghĩa từ các quan điểm hiệu quả viết mã và tính toán. Để biết tài khoản chi tiết hơn về xử lý dữ liệu với R bằng cách sử dụng phương pháp này, chúng tôi khuyên bạn nên sử dụng R cho Khoa học dữ liệu (Grolemund và Wickham 2016).dplyr and why it makes sense from code writing and computational efficiency perspectives. For a more detailed account of data processing with R using this approach we recommend R for Data Science (Grolemund and Wickham 2016).
Bài tập
- Hãy thử chạy từng ví dụ chuỗi trên từng dòng, vì vậy hai mục đầu tiên cho ví dụ đầu tiên sẽ trông như thế này:
df_base = data.frame(colA = "A")
1theo dõi bởi:
df_base = data.frame(colA = "A")
2Giải thích bằng lời của bạn những gì thay đổi mỗi lần.
- Sử dụng các chức năng DPPLYR Chained để trả lời câu hỏi sau: Trong năm nào các quốc gia không có ’một tên trong tên của họ có mức độ bất bình đẳng thấp nhất?dplyr functions to answer the following question: In which year did countries without an ‘a’ in their name have the lowest level of inequality?
Tập hợp dữ liệu
Tập hợp dữ liệu liên quan đến việc tạo các bản tóm tắt dữ liệu dựa trên một biến nhóm, trong một quy trình được gọi là ’-apply-bombine-combine. Kết quả cuối cùng thường có cùng số lượng hàng như có các nhóm. Bởi vì tập hợp là một cách để cô đọng các bộ dữ liệu, nó có thể là một kỹ thuật rất hữu ích để hiểu được các bộ dữ liệu lớn. Mã sau đây tìm thấy số lượng quốc gia duy nhất (quốc gia là biến nhóm) từ bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 được lưu trữ trong gói hiệu quả.efficient package.df_base = data.frame(colA = "A")
3Lưu ý rằng mặc dù có gần như \ (8000 \) hàng, có ít hơn 200 quốc gia: các yếu tố sẽ là một cách lưu trữ dữ liệu của các quốc gia hiệu quả hơn về không gian.\(8000\) rows, there are fewer than 200 countries: factors would have been a more space efficient way of storing the countries data.
Để tổng hợp bộ dữ liệu bằng gói dplyr, bạn chia tác vụ thành hai: để nhóm bộ dữ liệu trước và sau đó để tóm tắt, như được minh họa dưới đây.17dplyr package, you divide the task in two: to group the dataset first and then to summarise, as illustrated below.17
df_base = data.frame(colA = "A")
4Ví dụ trên liên quan đến vấn đề lập trình rộng hơn: một chức năng nên làm bao nhiêu công việc? Công việc có thể đã được thực hiện với một cuộc gọi
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
54 duy nhất. Tuy nhiên, triết lý của Unix nói rằng các chương trình nên làm một việc tốt, đó là cách các chức năng của DPPLYR đã được thiết kế. Các chức năng ngắn hơn dễ hiểu và gỡ lỗi hơn. Nhưng có quá nhiều chức năng cũng có thể làm cho ngăn xếp cuộc gọi của bạn khó hiểu.dplyr’s functions were designed. Shorter functions are easier to understand and debug. But having too many functions can also make your call stack confusing. Để củng cố điểm, thao tác này cũng được thực hiện dưới đây trên bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
55:df_base = data.frame(colA = "A")
5Lưu ý rằng
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
45 rất linh hoạt và có thể được sử dụng để trả về một phạm vi thống kê tóm tắt tùy chỉnh:df_base = data.frame(colA = "A")
6Để thể hiện sức mạnh của
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
45 được sử dụng trên library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
58, mã trên báo cáo một loạt các số liệu thống kê tóm tắt tùy chỉnh cho mỗi quốc gia:- số lượng hàng trong mỗi nhóm quốc gia
- Độ lệch chuẩn của các chỉ số Gini
- Tỷ lệ thu nhập trung bình kiếm được từ 10% hàng đầu
- Số năm mà chỉ số Gini lớn hơn 30
- Độ lệch chuẩn của các giá trị chỉ số Gini trên 30
- Phạm vi của các giá trị chỉ số Gini được báo cáo cho mỗi quốc gia.
Bài tập
Tham khảo lại ví dụ về khí thải nhà kính vào đầu phần 6.4, trong đó chúng tôi tìm thấy 3 quốc gia hàng đầu về tăng trưởng phát thải trong lĩnh vực vận tải. a) Giải thích bằng lời những gì đang diễn ra trong mỗi dòng. b) Cố gắng tìm 3 quốc gia hàng đầu về mặt khí thải vào năm 2012 - danh sách khác nhau như thế nào?
Khám phá tài liệu DPPLYR, bắt đầu với họa tiết giới thiệu, được truy cập bằng cách nhập
59.dplyr’s documentation, starting with the introductory vignette, accessed by enteringlibrary("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
59.library("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
Kiểm tra thêm dplyr ‘động từ trên bộ dữ liệu
55. (Có thể phát hiện thêm tên họa tiết bằng cách nhậplibrary("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
61.)dplyr ‘verbs’ on thelibrary("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
55 dataset. (More vignette names can be discovered by typinglibrary("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
61.)library("tibble") tibble(x = 1:3, y = c("A", "B", "C")) #> # A tibble: 3 x 2 #> x y #>
Đánh giá không tiêu chuẩn
Điều cuối cùng để nói về DPPLYR không liên quan đến dữ liệu mà là cú pháp của các chức năng. Lưu ý rằng nhiều đối số trong các ví dụ mã trong phần này được cung cấp dưới dạng tên thô: chúng là tên biến thô, không được bao quanh bởi các dấu ngoặc kép (ví dụ: & nbsp; ________ 118 thay vì
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
63). Điều này được gọi là đánh giá không chuẩn (NSE) (xem library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
64). NSE đã được sử dụng có chủ ý, với mục đích làm cho các chức năng hiệu quả hơn cho việc sử dụng tương tác. NSE giảm gõ và cho phép tự động hoàn thành trong rstudio.dplyr does not relate to the data but the syntax of the functions. Note that many of the arguments in the code examples in this section are provided as raw names: they are raw variable names, not surrounded by quote marks (e.g. library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
18 rather than library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
63). This is called non-standard evaluation (NSE) (see library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
64). NSE was used deliberately, with
the aim of making the functions more efficient for interactive use. NSE reduces typing and allows autocompletion in RStudio.Điều này là tốt khi sử dụng R tương tác. Nhưng khi bạn muốn sử dụng R không liên quan, mã thường mạnh mẽ hơn khi sử dụng đánh giá tiêu chuẩn: nó giảm thiểu cơ hội tạo các lỗi liên quan đến phạm vi tối nghĩa. Sử dụng đánh giá thường trực cũng tránh phải khai báo các biến toàn cầu nếu bạn đưa mã vào gói. Để khắc phục điều này, khái niệm đánh giá gọn gàng đã được phát triển và thực hiện trong gói RLANG (một phần của Tidyverse) để cung cấp các chức năng để kiểm soát khi các ký hiệu được đánh giá và khi chúng được coi là chuỗi văn bản. Không đi sâu vào chi tiết, mã bên dưới cho thấy cách đánh giá gọn gàng hoạt động (xem họa tiết
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
65 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
66 để biết thêm thông tin):rlang (part of the tidyverse) to provide functions to control when symbols are evaluated and when they are treated as text strings. Without going into detail, the code below demonstrates how tidy evaluation works (see the library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
65 vignette and
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
66 for further information):df_base = data.frame(colA = "A")
7Kết hợp bộ dữ liệu
Tính hữu ích của một bộ dữ liệu đôi khi có thể được tăng cường đáng kể bằng cách kết hợp nó với dữ liệu khác. Ví dụ, nếu chúng ta có thể hợp nhất bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 toàn cầu với dữ liệu địa lý, chúng ta có thể hình dung sự phân phối không gian của ô nhiễm khí hậu. Đối với các mục đích của phần này, chúng tôi tham gia library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 vào dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69 do GGMAP cung cấp để minh họa các khái niệm và phương pháp tham gia dữ liệu (còn được gọi là hợp nhất).ggmap to illustrate the concepts and methods of data joining (also referred to as merging).df_base = data.frame(colA = "A")
8So sánh trực quan bộ dữ liệu mới này của
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69 với library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 (ví dụ: & nbsp; thông qua library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
72). Rõ ràng là cột library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
73 trong cái trước chứa thông tin giống như library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
18 trong phần sau. Đây sẽ là biến tham gia; Đổi tên nó trong library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69 sẽ làm cho việc tham gia hiệu quả hơn.df_base = data.frame(colA = "A")
9Đảm bảo rằng cả hai biến tham gia đều có cùng một lớp (kết hợp các cột
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
76 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
77 có thể gây ra sự tàn phá).Sự chồng chéo giữa
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
78 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
79 lớn đến mức nào? Chúng ta có thể tìm hiểu bằng cách sử dụng toán tử library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
80, tìm ra có bao nhiêu phần tử trong một vectơ khớp với các vectơ khác. Cụ thể, chúng tôi sẽ tìm ra có bao nhiêu tên quốc gia duy nhất từ library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 có trong bộ dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69:print(df_base)
df_base$colA
df_base$col
df_base$colB
0Bài tập so sánh này đã có kết quả: Hầu hết các quốc gia trong bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
83 tồn tại trong bộ dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69. Nhưng những gì về 20 tên quốc gia không phù hợp? Chúng ta có thể xác định những điều này như sau:print(df_base)
df_base$colA
df_base$col
df_base$colB
1Rõ ràng từ đầu ra rằng một số không phù hợp (ví dụ: & nbsp; Liên minh châu Âu) hoàn toàn không phải là quốc gia. Tuy nhiên, những người khác, chẳng hạn như ‘Gambia, người và Hoa Kỳ rõ ràng nên có các trận đấu. Kết hợp mờ có thể giúp tìm thấy những quốc gia nào phù hợp, như được minh họa với quốc gia không phù hợp đầu tiên dưới đây:
print(df_base)
df_base$colA
df_base$col
df_base$colB
2Điều gì vừa xảy ra? Chúng tôi đã xác minh rằng quốc gia chưa từng có đầu tiên trong bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 không nằm trong tên quốc gia library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69. Vì vậy, chúng tôi đã sử dụng library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
87 mạnh hơn để tìm kiếm các trận đấu mờ (với đối số library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
88 được đặt thành library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
89. Kết quả cho thấy quốc gia library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
90 từ dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53 phù hợp với hai quốc gia trong bộ dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69. tham gia để phù hợp:print(df_base)
df_base$colA
df_base$col
df_base$colB
3Mã trên làm giảm số lượng tên quốc gia trong bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69 bằng cách thay thế cả hai Antigua Hồi và Barbuda Hồi thành Hồi Antigua & Barbuda. Điều này sẽ không hoạt động theo cách khác xung quanh: Làm thế nào người ta biết có nên thay đổi chương trình Antigua & Barbuda, thành một cách khác, hay đối với Barbuda hay.Do đó, sự kết hợp mờ nhạt vẫn là một quá trình tốn nhiều công sức phải được bổ sung bởi sự phán đoán của con người. Một con người phải biết chắc chắn rằng
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
94 được biểu diễn dưới dạng library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
95 trong bộ dữ liệu library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
69, mà không có rủi ro phù hợp sai thông qua library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
87.Làm việc với cơ sở dữ liệu
Thay vì tải tất cả dữ liệu vào RAM, như R, cơ sở dữ liệu dữ liệu từ đĩa cứng. Điều này có thể cho phép một tập hợp con của một bộ dữ liệu rất lớn được xác định và đọc thành R nhanh chóng, mà không phải tải nó trước. R có thể kết nối với cơ sở dữ liệu theo một số cách, được chạm vào ngắn gọn bên dưới. Cơ sở dữ liệu là một lĩnh vực chủ đề lớn trải qua quá trình tiến hóa nhanh chóng. Thay vì nhằm mục đích bảo hiểm toàn diện, chúng tôi sẽ cung cấp các gợi ý cho các phát triển cho phép truy cập hiệu quả vào một loạt các loại cơ sở dữ liệu. Có thể tìm thấy lịch sử cập nhật của các giao diện R, đến cơ sở dữ liệu trong readme của gói DBI, cung cấp một giao diện chung và tập hợp các lớp cho các gói trình điều khiển (như rsqlite).DBI package, which provides a common interface and set of classes for driver packages (such as RSQLite).
RODBC là một gói kỳ cựu để truy vấn cơ sở dữ liệu bên ngoài từ bên trong R, sử dụng API kết nối cơ sở dữ liệu mở (ODBC). Chức năng của Rodbc được mô tả trong gói Vignette của gói (xem
98) và ngày nay sử dụng chính của nó là cung cấp giao diện R cho cơ sở dữ liệu SQL Server thiếu giao diện DBI. is a veteran package for querying external databases from within R, using the Open Database Connectivity (ODBC) API. The functionality of RODBC is described in the package’s vignette (see library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
98) and nowadays its main use is to provide an R interface to SQL Server databases which lack a DBI interface.Gói DBI là một khung thống nhất để truy cập cơ sở dữ liệu cho phép các trình điều khiển khác được thêm vào dưới dạng các gói mô -đun. Do đó, các gói mới xây dựng trên DBI có thể được xem một phần như là sự thay thế của Rodbc (RMYSQL, RPostgresQL và RSQLite) (xem
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
99 để biết thêm về cách trình điều khiển DBI hoạt động). Bởi vì cú pháp DBI áp dụng cho một loạt các loại cơ sở dữ liệu, chúng tôi sử dụng nó ở đây với một ví dụ hoạt động.DBI package is a unified framework for
accessing databases allowing for other drivers to be added as modular packages. Thus new packages that build on DBI can be seen partly as a replacement of RODBC (RMySQL, RPostgreSQL, and RSQLite) (see library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
99 for more on how DBI drivers work). Because the DBI syntax applies to a wide range of database types we use it here with a worked example.print(df_base)
df_base$colA
df_base$col
df_base$colB
4Hãy tưởng tượng bạn có quyền truy cập vào cơ sở dữ liệu chứa bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
53.print(df_base)
df_base$colA
df_base$col
df_base$colB
5Đoạn mã trên cho thấy cách hàm
df_base = data.frame(colA = "A")
01 kết nối với cơ sở dữ liệu bên ngoài, trong trường hợp này là cơ sở dữ liệu SQLite. Các đối số df_base = data.frame(colA = "A")
02 và df_base = data.frame(colA = "A")
03 được sử dụng để thiết lập kết nối. Tiếp theo, chúng tôi truy vấn các bảng nào có sẵn với df_base = data.frame(colA = "A")
04, truy vấn cơ sở dữ liệu (mà không trích xuất kết quả thành R) với df_base = data.frame(colA = "A")
05 và cuối cùng, tải kết quả vào R với df_base = data.frame(colA = "A")
06.Hãy chắc chắn không bao giờ phát hành mật khẩu của bạn bằng cách nhập trực tiếp vào lệnh. Thay vào đó, chúng tôi khuyên bạn nên lưu thông tin nhạy cảm như mật khẩu cơ sở dữ liệu và khóa API trong
df_base = data.frame(colA = "A")
07, được mô tả trong Chương 2. Giả sử bạn đã lưu mật khẩu của mình dưới dạng biến môi trường df_base = data.frame(colA = "A")
08 Mã hoặc lịch sử phiên của bạn.Gần đây, đã có một sự thay đổi theo cách tiếp cận ‘NoQuery, để lưu trữ các bộ dữ liệu lớn. Điều này được minh họa bằng sự xuất hiện và sự hấp thu của phần mềm như MongoDB và Apache Cassandra, có giao diện R thông qua các gói Mông Cổ và RJDBC, có thể kết nối với các cửa hàng dữ liệu Apache Cassandra và bất kỳ nguồn nào tuân thủ API kết nối cơ sở dữ liệu Java (JDBC).
MonetDB là một giải pháp thay thế gần đây cho các phương pháp quan hệ và NoQuery mang lại lợi thế hiệu quả đáng kể để xử lý các bộ dữ liệu lớn (Kersten et al. 2011). Một hướng dẫn trên trang web MonetDB cung cấp một giới thiệu tuyệt vời về cơ sở dữ liệu xử lý từ bên trong R.(Kersten et al. 2011). A tutorial on the MonetDB website provides an excellent introduction to handling databases from within R.
Có nhiều cân nhắc rộng hơn liên quan đến cơ sở dữ liệu mà chúng tôi sẽ không bao gồm ở đây: ai sẽ quản lý và duy trì cơ sở dữ liệu? Làm thế nào nó sẽ được sao lưu tại địa phương (các bản sao cục bộ nên được lưu trữ để giảm sự phụ thuộc vào mạng)? Cơ sở dữ liệu thích hợp cho dự án của bạn là gì. Những vấn đề này có thể có ý nghĩa lớn đối với hiệu quả, đặc biệt là trên các dự án lớn, dữ liệu. Tuy nhiên, chúng tôi sẽ không bao gồm chúng ở đây vì đây là một lĩnh vực di chuyển nhanh. Thay vào đó, chúng tôi hướng người đọc quan tâm đến các tài nguyên tiếp theo về chủ đề này, bao gồm:
- Trang web cho Sparklyr, một gói gần đây để giao tiếp hiệu quả với Apache Spark Stack.sparklyr, a recent package for efficiently interfacing with the Apache Spark stack.
- db-engines.com/en/: một trang web so sánh giá trị tương đối của các cơ sở dữ liệu khác nhau.
- Các họa tiết
10 từ gói DPPLYR.dplyr package.df_base = data.frame(colA = "A")
- Bắt đầu với MongoDB trong R, một họa tiết giới thiệu trên cơ sở dữ liệu phi quan hệ và giảm MAP từ gói Mongolite.mongolite package.
Cơ sở dữ liệu và dplyrdplyr
Để truy cập cơ sở dữ liệu trong r qua DPPLER, người ta phải sử dụng một trong các hàm
df_base = data.frame(colA = "A")
11 để tạo nguồn. Tiếp tục với ví dụ SQLite ở trên, người ta sẽ tạo ra một đối tượng library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
8, có thể được DPPLE truy vấn như sau:dplyr, one must use one of the df_base = data.frame(colA = "A")
11 functions to create a source. Continuing with the SQLite example
above, one would create a library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
8 object, that can be queried by dplyr as follows:print(df_base)
df_base$colA
df_base$col
df_base$colB
6Đối tượng
df_base = data.frame(colA = "A")
13 sau đó có thể được truy vấn theo cách tương tự với khung dữ liệu tiêu chuẩn. Ví dụ: giả sử chúng tôi muốn lọc theo library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
18. Sau đó, chúng tôi sử dụng chức năng df_base = data.frame(colA = "A")
15 như trước:print(df_base)
df_base$colA
df_base$col
df_base$colB
7Trong mã trên, DPPLYR đã thực sự tạo ra lệnh SQL cần thiết, có thể được kiểm tra bằng
df_base = data.frame(colA = "A")
16. Khi làm việc với cơ sở dữ liệu, DPPLYR sử dụng đánh giá lười biếng: dữ liệu chỉ được tìm nạp vào giây phút cuối cùng khi nó cần. Lệnh SQL được liên kết với df_base = data.frame(colA = "A")
17 vẫn chưa được thực thi, đây là lý do tại sao df_base = data.frame(colA = "A")
18 không hoạt động. Bằng cách sử dụng đánh giá lười biếng, DPPLYR hiệu quả hơn trong việc xử lý các cấu trúc dữ liệu lớn vì nó tránh được việc sao chép không cần thiết. Khi bạn muốn lệnh SQL của mình được thực thi, hãy sử dụng df_base = data.frame(colA = "A")
19.dplyr has actually generated the necessary SQL command, which can be examined using df_base = data.frame(colA = "A")
16. When working with
databases, dplyr uses lazy evaluation: the data is only fetched at the last moment when it’s needed. The SQL command associated with df_base = data.frame(colA = "A")
17 hasn’t yet been executed, this is why df_base = data.frame(colA = "A")
18 doesn’t work. By using lazy evaluation, dplyr is more efficient at handling large data structures since it avoids unnecessary copying. When you want your SQL command to be executed, use df_base = data.frame(colA = "A")
19.Giai đoạn cuối cùng khi làm việc với cơ sở dữ liệu trong R là ngắt kết nối, ví dụ:
Bài tập
Thực hiện theo ví dụ hoạt động dưới đây để tạo và truy vấn cơ sở dữ liệu về giá đất ở Anh bằng cách sử dụng DPPLYR làm mặt trước của cơ sở dữ liệu SQLite. Giai đoạn đầu tiên là đọc dữ liệu:dplyr as a front end to an SQLite database. The first stage is to read-in the data:
print(df_base)
df_base$colA
df_base$col
df_base$colB
8Giai đoạn tiếp theo là tạo cơ sở dữ liệu SQLite để giữ dữ liệu:
print(df_base)
df_base$colA
df_base$col
df_base$colB
9Đối tượng mới
df_base = data.frame(colA = "A")
20 mới là lớp nào?Tại sao chúng ta sử dụng đối số
df_base = data.frame(colA = "A")
21?Từ mã trên, chúng ta có thể thấy rằng chúng ta đã tạo ra một
library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
8. Điều này có thể được truy cập bằng cách sử dụng DPPLYR giống như bất kỳ khung dữ liệu nào có thể. Bây giờ chúng tôi có thể truy vấn dữ liệu. Bạn có thể sử dụng mã SQL để truy vấn trực tiếp cơ sở dữ liệu hoặc sử dụng các động từ DPPLY tiêu chuẩn trên bảng.dplyr in the same way as any data frame can. Now we can query the data. You can use SQL code to query the database directly or use standard dplyr verbs on the table.library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
0Làm thế nào bạn sẽ thực hiện cùng một truy vấn bằng cách sử dụng
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
50? Hãy thử để xem bạn có nhận được kết quả tương tự không (Gợi ý: Sử dụng BackTicks cho tên biến df_base = data.frame(colA = "A")
24).Xử lý dữ liệu với dữ liệu. Có thể
Data.Table là một gói trưởng thành để xử lý dữ liệu nhanh trình bày một giải pháp thay thế cho DPPLYR. Có một số tranh cãi về việc phù hợp hơn cho các nhiệm vụ khác nhau.18, hiệu quả hơn ở một mức độ nào đó phụ thuộc vào sở thích cá nhân và những gì bạn đã quen. Cả hai đều là các gói mạnh mẽ và hiệu quả cần có thời gian để học, vì vậy tốt nhất là học một và gắn bó với nó, thay vì có tính hai mặt của việc sử dụng hai cho mục đích tương tự. Có những tình huống trong đó một người hoạt động tốt hơn một tình huống khác: DPPLY cung cấp giao diện nhất quán và linh hoạt hơn (ví dụ: & nbsp; với giao diện của nó với cơ sở dữ liệu, được thể hiện trong phần trước) vì vậy đối với hầu hết các mục đích, chúng tôi khuyên bạn nên học DPPLE trước nếu bạn không phải là cả hai gói. DPPLYR cũng có thể được sử dụng để làm việc với lớp
25 được sử dụng bởi gói dữ liệu. is a mature package for fast data processing that presents an alternative to dplyr. There is some controversy about which is more appropriate for different tasks.18 Which is more efficient to some extent depends on personal preferences and
what you are used to. Both are powerful and efficient packages that take time to learn, so it is best to learn one and stick with it, rather than have the duality of using two for similar purposes. There are situations in which one works better than another: dplyr provides a more consistent and flexible interface (e.g. with its interface to databases, demonstrated in the previous section) so for most purposes we recommend learning dplyr first if you are new
to both packages. dplyr can also be used to work with the df_base = data.frame(colA = "A")
df_base = data.frame(colA = "A")
25 class used by the data.table package so you can get the best of both worlds.Data.Table nhanh hơn DPPLYR cho một số hoạt động và cung cấp một số chức năng không có sẵn trong các gói khác, hơn nữa, nó có một cộng đồng người dùng trưởng thành và tiên tiến. Data.Table hỗ trợ các lần nối cuộn (cho phép các hàng trong một bảng được chọn dựa trên sự gần gũi giữa các biến được chia sẻ (thường là thời gian) và các kết nối không cân bằng (trong đó các tiêu chí tham gia có thể là bất bình đẳng thay vì bằng). is faster than dplyr for some operations and offers some functionality unavailable in other packages, moreover it has a mature and advanced user community. data.table supports rolling joins (which allow rows in one table to be selected based on proximity between shared variables (typically time) and non-equi joins (where join criteria can be inequalities rather than equal to).
Phần này cung cấp một vài ví dụ để minh họa cách dữ liệu. Có thể khác nhau và (có nguy cơ gây ra cuộc tranh luận thêm) một số điểm chuẩn để khám phá hiệu quả hơn. Như được nhấn mạnh trong suốt cuốn sách, việc viết mã hiệu quả thường quan trọng hơn việc thực hiện hiệu quả trong nhiều nhiệm vụ hàng ngày, vì vậy ở một mức độ nào đó, nó là một vấn đề ưu tiên.data.table differs and (at the risk of inflaming the debate further) some benchmarks to explore which is more efficient. As emphasised throughout the book, efficient code writing is often more important than efficient execution on many everyday tasks so to some extent it’s a matter of preference.
Lớp đối tượng nền tảng của dữ liệu. Có thể là
df_base = data.frame(colA = "A")
25. Giống như DPPLYRTHER library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
5, các đối tượng Data.Table, ____2225 hoạt động giống như lớp library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
6 cơ sở. Tuy nhiên, mô hình dữ liệu.Table có một số tính năng độc đáo giúp nó hiệu quả về mặt tính toán cao đối với nhiều tác vụ phổ biến trong phân tích dữ liệu. Dựa trên các phương pháp tập hợp con bằng cách sử dụng library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
36 và library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
34, đã đề cập trước đây, chúng tôi sẽ thấy Data.Tables Phương pháp tiếp cận duy nhất để tập hợp con. Giống như cơ sở r data.Table sử dụng dấu ngoặc vuông nhưng (không giống như cơ sở r nhưng như dplyr) sử dụng đánh giá không chuẩn để bạn không cần tham khảo tên đối tượng bên trong dấu ngoặc:data.table is the df_base = data.frame(colA = "A")
25. Like dplyr’s library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
5, data.table’s df_base = data.frame(colA = "A")
25 objects behave in the same was as the base library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
6 class. However
the data.table paradigm has some unique features that make it highly computationally efficient for many common tasks in data analysis. Building on subsetting methods using library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
36 and library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
34, mentioned previously, we’ll see data.tables’s unique approach to subsetting. Like base R data.table uses square brackets but (unlike base R but like dplyr) uses non-standard evaluation so you need not refer to the object name inside the
brackets:library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
1Lưu ý rằng các dấu ngoặc vuông không cần dấu phẩy để chỉ các hàng với các đối tượng
df_base = data.frame(colA = "A")
25: Trong cơ sở r, bạn sẽ viết df_base = data.frame(colA = "A")
33.Để tăng hiệu suất, người ta có thể đặt ‘phím, tương tự như các khóa chính trong cơ sở dữ liệu. Đây là ‘rownames siêu tăng áp, đặt bảng dựa trên một hoặc nhiều biến. Điều này cho phép thuật toán tìm kiếm nhị phân để tập hợp các hàng quan tâm, nhanh hơn nhiều so với phương pháp quét vector được sử dụng trong cơ sở R (xem
df_base = data.frame(colA = "A")
34). Data.Table sử dụng các giá trị khóa để tập hợp theo mặc định để biến không cần được đề cập lại. Thay vào đó, sử dụng các khóa, tiêu chí tìm kiếm được cung cấp làm danh sách (được gọi bên dưới với cú pháp df_base = data.frame(colA = "A")
35 ngắn gọn, đồng nghĩa với df_base = data.frame(colA = "A")
36).data.table uses the key values for subsetting by default so the variable does not need to be mentioned again. Instead, using keys, the search criteria is provided as a list (invoked below with the concise
df_base = data.frame(colA = "A")
35 syntax, which is synonymous with df_base = data.frame(colA = "A")
36).library("efficient")
data(pew) # see ?pew - dataset from the efficient package
pew[1:3, 1:4] # take a look at the data
#> # A tibble: 3 x 4
#> religion `<$10k` `$10--20k` `$20--30k`
#>
#> 1 Agnostic 27 34 60
#> 2 Atheist 12 27 37
#> 3 Buddhist 27 21 30
2Kết quả là như nhau, vậy tại sao thêm giai đoạn bổ sung của việc thiết lập khóa? Lý do là hoạt động sắp xếp một lần này có thể dẫn đến mức tăng hiệu suất đáng kể trong các tình huống liên tục tập hợp các hàng trên các bộ dữ liệu lớn tiêu thụ một tỷ lệ lớn thời gian tính toán trong quy trình làm việc của bạn. Điều này được minh họa trong Hình 6.1, so sánh 4 phương pháp tập hợp các phiên bản lớn hơn của bộ dữ liệu
library("tibble")
tibble(x = 1:3, y = c("A", "B", "C"))
#> # A tibble: 3 x 2
#> x y
#>
#> 1 1 A
#> 2 2 B
#> 3 3 C
55.
Hình 6.1: Điểm chuẩn minh họa các mức tăng hiệu suất được mong đợi cho các kích thước dữ liệu khác nhau.
Hình 6.1 chứng minh rằng dữ liệu. Có thể nhanh hơn nhiều so với cơ sở r và dplyr khi tập hợp con. Như với việc sử dụng các gói bên ngoài để đọc trong dữ liệu (xem Phần 5.3), lợi ích tương đối của dữ liệu. Có thể cải thiện với kích thước bộ dữ liệu, tiếp cận cải tiến ~ 70 lần trên cơ sở R và cải tiến gấp 50 lần trên DPPLY khi kích thước bộ dữ liệu đạt nửa một gigabyte. Điều thú vị là, ngay cả việc triển khai ‘không khóa của phương thức tập hợp dữ liệu. Quá trình tạo các tài khoản khóa cho tốc độ tăng tốc ~ 10 lần trong trường hợp khóa đã được tạo sẵn.data.table is much faster than base R and dplyr at subsetting. As with using external packages to read in data (see Section 5.3), the relative benefits of data.table improve with dataset size, approaching a ~70 fold improvement on base R and a ~50 fold improvement on dplyr as the dataset size reaches half a Gigabyte. Interestingly, even the ‘non key’ implementation of data.table subset method is faster than the alternatives: this is because data.table creates a key internally by default before subsetting. The process of creating the key accounts for the ~10 fold speed-up in cases where the key has been pre-generated.
Phần này đã giới thiệu dữ liệu. Có thể là một cách tiếp cận miễn phí cho các phương thức cơ sở và DPPLYR để xử lý dữ liệu. Nó cung cấp mức tăng hiệu suất do thực hiện C trong C và sử dụng các phím cho các bảng tập hợp. Dữ liệu.Table cung cấp nhiều hơn, tuy nhiên, bao gồm: định hình lại dữ liệu hiệu quả cao; Hợp nhất bộ dữ liệu (còn được gọi là tham gia, như với
df_base = data.frame(colA = "A")
38 trong dplyr); và nhóm. Để biết thêm thông tin về dữ liệu. Có thể, chúng tôi khuyên bạn nên đọc gói Vignette df_base = data.frame(colA = "A")
39, df_base = data.frame(colA = "A")
40 và df_base = data.frame(colA = "A")
41.data.table as a complimentary approach to base and dplyr methods for data processing. It offers performance gains due to its implementation in C and use of keys for subsetting tables. data.table offers much more, however, including: highly efficient data reshaping; dataset merging (also known as joining, as with df_base = data.frame(colA = "A")
38 in dplyr); and grouping. For further information on
data.table, we recommend reading the package’s df_base = data.frame(colA = "A")
39, df_base = data.frame(colA = "A")
40 and df_base = data.frame(colA = "A")
41 vignettes.Người giới thiệu
Codd, E. F. 1979. Mở rộng mô hình quan hệ cơ sở dữ liệu để nắm bắt nhiều ý nghĩa hơn. Giao dịch ACM trên hệ thống cơ sở dữ liệu 4 (4): 397 Từ434. https://doi.org/10.1145/320107.320109.
Grolemund, G. và H. Wickham. 2016. R cho khoa học dữ liệu. Phương tiện truyền thông O hèReilly.
Kersten, Martin L, Stratos Idreos, Stefan Manegold, Erietta Liarou và những người khác. 2011. Hướng dẫn của nhà nghiên cứu về dữ liệu Deluge: Truy vấn cơ sở dữ liệu khoa học chỉ trong vài giây. PVLDB thách thức và tầm nhìn 3.
Spector, Phil. 2008 Thao tác dữ liệu với R. Springer Science & Business Media.
Wickham, Hadley. 2010. Chuỗi Stringr: Xử lý chuỗi hiện đại, nhất quán. Tạp chí R 2 (2): 38 trận40.
Wickham, Hadley. 2014b. Dữ liệu gọn gàng. Tạp chí Phần mềm thống kê 14 (5).