您应该知道的R data.table符号和运算符
當(dāng)您利用R data.table代碼的特殊符號和功能時,它會變得更加高效且優(yōu)雅。 考慮到這一點,我們將研究一些子集,計數(shù)和創(chuàng)建新列的特殊方法。
對于此演示,我將使用2019年Stack Overflow開發(fā)人員調(diào)查中的數(shù)據(jù),大約有90,000個響應(yīng)。 如果要繼續(xù)學(xué)習(xí),可以從Stack Overflow 下載數(shù)據(jù) 。
如果您的系統(tǒng)上未安裝data.table軟件包,請從CRAN安裝它,然后像往常一樣使用library(data.table)加載它。 首先,您可能只想讀入數(shù)據(jù)集的前幾行,以便更輕松地檢查數(shù)據(jù)結(jié)構(gòu)。 您可以使用data.table的fread()函數(shù)和nrows參數(shù)來實現(xiàn)。 我將閱讀10行:
data_sample <- fread("data/survey_results_public.csv", nrows = 10)如您所見,有85列要檢查。 (如果您想知道所有列的含義,則下載的文件中包含數(shù)據(jù)模式和原始調(diào)查的PDF。)
要讀取所有數(shù)據(jù),我將使用:
mydt <- fread("data/survey_results_public.csv")接下來,我將創(chuàng)建一個只有幾列的新的data.table,以使其更易于使用和查看結(jié)果。 提醒您data.table使用以下基本語法:
mydt[i, j, by]data.table程序包介紹說,將其理解為“使用i進(jìn)行dt,子集或重新排序行,計算j,依據(jù)”。 請記住,i和j與基R的括號排序類似:第一行,第二列。 因此,我適合您要對行執(zhí)行的操作(根據(jù)行號或條件選擇行); j是您對列所做的操作(選擇列或從計算中創(chuàng)建新列)。 但是,還請注意,與基本R數(shù)據(jù)框相比,您可以在data.table括號內(nèi)做更多的事情。 而且“ by”部分是data.table的新功能。
由于我正在選擇列,因此該代碼位于“ j”位置,這意味著方括號需要首先用逗號將“ i”位置保留為空:
mydt[, j]選擇data.table列
我喜歡data.table的一件事是,很容易選擇帶引號或不帶引號的列。 不帶引號通常更方便(通常是整齊的方式)。 但是如果您要在自己的函數(shù)中使用data.table,或者要傳遞在代碼中其他位置創(chuàng)建的向量,則使用quoted很有用。
您可以選擇典型的基R方式data.table列,并使用帶引號的列名稱的常規(guī)向量。 例如:
dt1 <- mydt[, c("LanguageWorkedWith", "LanguageDesireNextYear","OpenSourcer", "CurrencySymbol", "ConvertedComp”,
“Hobbyist”)]
如果要不加引號地使用它們,請創(chuàng)建一個列表而不是一個矢量,然后可以傳遞未加引號的名稱。
dt1 <- mydt[, list(LanguageWorkedWith, LanguageDesireNextYear,OpenSourcer, CurrencySymbol, ConvertedComp,
Hobbyist)]
現(xiàn)在我們來第一個特殊符號。 除了輸入list() ,您還可以使用點:
dt1 <- mydt[, .(LanguageWorkedWith, LanguageDesireNextYear,OpenSourcer, CurrencySymbol, ConvertedComp,
Hobbyist)]
.()是data.table括號內(nèi)list()的快捷方式。
如果要使用一個已經(jīng)存在的列名向量怎么辦? 將矢量對象名稱放在data.table括號內(nèi)將不起作用。 如果創(chuàng)建帶有引號的列名的向量,如下所示:
mycols <- c("LanguageWorkedWith", "LanguageDesireNextYear","OpenSourcer", "CurrencySymbol", "ConvertedComp", "Hobbyist")
那么這個代碼將無法正常工作:
dt1 <- mydt[, mycols]相反,您需要在矢量對象名稱的前面放置.. (兩個點):
dt1 <- mydt[, ..mycols]為什么要兩個點? 在我閱讀說明之前,這對我來說似乎是隨機的。 可以將其想像成Unix命令行終端中的兩個點,它們將您向上移動一個目錄。 在這里,您正在將一個命名空間 (從data.table括號內(nèi)的環(huán)境上移到全局環(huán)境)上移。 (這確實幫助我記住了!)
計數(shù)數(shù)據(jù)表行
轉(zhuǎn)到下一個符號。 要按組計數(shù),可以使用data.table的.N符號,其中.N代表“行數(shù)”。 它可以是總行數(shù),也可以是每個組的行數(shù)(如果您在“ by”部分中進(jìn)行匯總)。
此表達(dá)式返回data.table中的總行數(shù):
mydt[, .N]下面的示例計算按一個變量分組的行數(shù):調(diào)查中的人是否也將代碼編碼為嗜好( Hobbyist變量)。
mydt[, .N, Hobbyist]# returns:
Hobbyist N 1: Yes 71257 2: No 17626
如果只有一個變量,則可以在data.table括號內(nèi)使用普通列名稱。 如果要按兩個或多個變量分組,請使用. 符號。 例如:
mydt[, .N, .(Hobbyist, OpenSourcer)]要從最高到最低排序結(jié)果,您可以在第一組之后添加第二組。 .N符號會自動生成一個名為N的列(當(dāng)然,您可以根據(jù)需要對其進(jìn)行重命名),因此按行數(shù)排序的方式如下所示:
mydt[, .N, .(Hobbyist, OpenSourcer)][order(Hobbyist, -N)]在學(xué)習(xí)data.table代碼時,我發(fā)現(xiàn)逐步閱讀它很有幫助。 因此,我將其讀為“對于mydt中的所有行(因為“ I”位置中沒有任何內(nèi)容),對行數(shù)進(jìn)行計數(shù),并按Hobbyist和OpenSourcer進(jìn)行分組。 然后先由Hobbyist排序,然后行數(shù)降序。”
等效于以下dplyr代碼:
mydf %>%count(Hobbyist, OpenSourcer) %>%
order(Hobbyist, -n)
如果您發(fā)現(xiàn)tidyverse常規(guī)多行方法更具可讀性,那么此data.table代碼也可以工作:
mydt[, .N,.(Hobbyist, OpenSourcer)][
order(Hobbyist, -N)
]
將列添加到data.table
接下來,我想添加列以查看每個受訪者是否使用R,是否使用Python,是否都使用R或都不使用R。 LanguageWorkedWith列包含有關(guān)所用LanguageWorkedWith信息,該數(shù)據(jù)的幾行如下所示:
沙龍·馬克斯(Sharon Machlis)Stack Overflow開發(fā)人員調(diào)查數(shù)據(jù)的LanguagesWorkedWith列的幾行。
每個答案都是一個字符串。 大多數(shù)語言有多種語言,用分號分隔。
通常,與R相比,搜索Python要容易得多,因為您不僅可以使用搜索“ Python”的方式在字符串中搜索“ R”(Ruby和Rust也包含大寫的R)。 這是創(chuàng)建TRUE / FALSE向量的簡單代碼,該向量檢查LanguageWorkedWith中的每個字符串是否包含Python:
ifelse(LanguageWorkedWith %like% "Python", TRUE, FALSE)如果您知道SQL,就會認(rèn)識到這種“贊”語法。 我,就像%like%. 這是檢查模式匹配的一種很好的簡化方法。 函數(shù)文檔說,它打算在data.table括號內(nèi)使用,但實際上您可以在任何代碼中使用它,而不僅僅是data.tables。 我與data.table的創(chuàng)建者M(jìn)att Dowle進(jìn)行了核對,他說在括號內(nèi)使用它的建議是因為在那里進(jìn)行了一些額外的性能優(yōu)化。
接下來,下面的代碼將一個名為PythonUser的列添加到data.table中:
dt1[, PythonUser := ifelse(LanguageWorkedWith %like% "Python", TRUE, FALSE)]注意:=運算符。 Python也有類似的運算符,自從我聽說它被稱為“海象運算符”以來,這就是我所說的。 我認(rèn)為這是正式的“參考轉(zhuǎn)讓”。 這是因為上面的代碼通過添加新列來更改了現(xiàn)有對象dt1 data.table, 而無需將其保存到新變量中。
要搜索R,我將使用正則表達(dá)式"\\bR\\b"表示:“找到一個以單詞邊界開頭的模式- \\b ,然后是R ,然后以另一個單詞邊界結(jié)束。 (我不能只尋找“ R;”,因為每個字符串中的最后一項沒有分號。)
這會將RUser列添加到dt1:
dt1[, RUser := ifelse(LanguageWorkedWith %like% "\\bR\\b", TRUE, FALSE)]如果要使用:=一次添加兩列,則需要通過反引號將該海象運算符轉(zhuǎn)換為函數(shù),如下所示:
dt1[, `:=` (PythonUser = ifelse(LanguageWorkedWith %like% "Python", TRUE, FALSE),
RUser = ifelse(LanguageWorkedWith %like% "\\bR\\b", TRUE, FALSE)
)]
更有用的data.table運算符
還有其他一些data.table運算符值得了解。 %between%運算符具有以下語法:
myvector %between% c(lower_value, upper_value)因此,如果我要過濾所有賠償金額在50,000到100,000美元之間的所有答復(fù),則此代碼有效:
comp_50_100k <- dt1[CurrencySymbol == "USD" &ConvertedComp %between% c(50000, 100000)]
上面的第二行是介于兩者之間的條件。 請注意, %between%運算符在檢查時包括下限值和上限值。
另一個有用的運算符是%chin% 。 它的工作方式類似于基R的%in%但針對速度進(jìn)行了優(yōu)化,并且僅適用于字符向量 。 因此,如果我要過濾OpenSourcer列為“從不”或“每年少于一次”的所有行,則此代碼有效:
rareos <- dt1[OpenSourcer %chin% c("Never", "Less than once per year")]這與基本R非常相似,不同之處在于基本R必須在括號內(nèi)指定數(shù)據(jù)框名稱,并且在過濾器表達(dá)式后還需要逗號:
rareos_df <- df1[df1$OpenSourcer %in% c("Never", "Less than once per year"),]新的fcase()函數(shù)
對于最后一個演示,我將首先創(chuàng)建一個新的data.table,其中僅包含以美元報告的人:
usd <- dt1[CurrencySymbol == "USD" & !is.na(ConvertedComp)]接下來,我將創(chuàng)建一個名為Language的新列,用于說明某人是僅使用R,僅使用Python還是不使用。 我將使用新的fcase()函數(shù)。 在本文發(fā)布時, fcase()僅在data.table的開發(fā)版本中可用。 如果已經(jīng)安裝了data.table,則可以使用以下命令更新到最新的dev版本:
data.table::update.dev.pkg()fcase()函數(shù)類似于SQL的CASE WHEN語句和dplyr的case_when()函數(shù)。 基本語法為fcase(condition1, "value1", condition2, "value2")等。 可以使用default = value添加“其他所有內(nèi)容”的default = value 。
這是創(chuàng)建新的“語言”列的代碼:
usd[, Language := fcase(RUser & !PythonUser, "R",
PythonUser & !RUser, "Python",
PythonUser & RUser, "Both",
!PythonUser & !RUser, "Neither"
)]
我將每個條件放在單獨的行上,因為我發(fā)現(xiàn)它更易于閱讀,但您不必這樣做。
注意:如果您使用的是RStudio,則在使用walrus運算符創(chuàng)建新列之后,data.table結(jié)構(gòu)不會在右上方的RStudio窗格中自動更新。 您需要手動單擊刷新圖標(biāo)以查看列數(shù)的更改。
在本文中我將不介紹其他一些符號。 您可以通過運行help("special-symbols")在“特殊符號” data.table幫助文件中找到它們的列表。 最有用的.SD之一已經(jīng)有自己的《用R做更多事情 》文章和視頻,“ 如何在R data.table包中使用.SD ”。
有關(guān)R的更多技巧,請轉(zhuǎn)到InfoWorld上的“用R做更多”頁面,或查看YouTube播放列表中的“用R做更多” 。
From: https://www.infoworld.com/article/3530348/r-datatable-symbols-and-operators-you-should-know.html
總結(jié)
以上是生活随笔為你收集整理的您应该知道的R data.table符号和运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12-06-微信小程序手写知识点
- 下一篇: 如何下载淘宝视频