日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

您应该知道的R data.table符号和运算符

發(fā)布時間:2024/3/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 您应该知道的R data.table符号和运算符 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。