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