亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

R語(yǔ)言之dplyr包常用函數(shù)方法示例學(xué)習(xí)

 更新時(shí)間:2023年08月25日 10:30:06   作者:YOLO  
這篇文章主要為大家介紹了R語(yǔ)言之dplyr包常用函數(shù)方法示例學(xué)習(xí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

文章和代碼已經(jīng)歸檔至【Github倉(cāng)庫(kù):https://github.com/timerring/dive-into-AI 】

這個(gè)包以一種統(tǒng)一的規(guī)范更高效地處理數(shù)據(jù)框。dplyr 包里處理數(shù)據(jù)框的所有函數(shù)的第一個(gè)參數(shù)都是數(shù)據(jù)框名。

下面以 MASS 包里的 birthwt 數(shù)據(jù)集為例,介紹 dplyr 包里常用函數(shù)的用法。該數(shù)據(jù)集來(lái)自一項(xiàng)關(guān)于新生兒低體重危險(xiǎn)因素的病例對(duì)照研究。首先加載該數(shù)據(jù)集并查看其相關(guān)信息。

library(dplyr)
data(birthwt, package = "MASS")
# ??birthwt

數(shù)據(jù)集 birthwt 里一共包含 189 個(gè)研究對(duì)象、10 個(gè)變量。其中結(jié)果變量 bwt 是新生兒的體重(單位:g),變量 low 是將 bwt 的取值以 2500g 為分點(diǎn)轉(zhuǎn)換成的一個(gè)二分類(lèi)變量。其余 8 個(gè)變量均為預(yù)測(cè)變量,包括孕婦的年齡(age)、種族(race)、吸煙狀況(smoke)、高血壓史(ht)等。

1.使用 filter( ) 和 slice( ) 篩選行

函數(shù) filter() 可以基于觀測(cè)值篩選數(shù)據(jù)框的一個(gè)子集。第一個(gè)參數(shù)是數(shù)據(jù)框名,第二個(gè)參數(shù)以及隨后的參數(shù)是用來(lái)篩選數(shù)據(jù)框的表達(dá)式。

例如,篩選數(shù)據(jù)框里年齡大于 35 歲的對(duì)象的所有記錄:

filter(birthwt, age > 35)

函數(shù) filter ( ) 里可以用逗號(hào)分隔多個(gè)條件。使用下面的命令將會(huì)選擇選擇年齡大于 35 歲,并且出生體重小于 2500g 或者大于 4000g 的所有記錄,因?yàn)橛涗涊^多,這里只顯示了前 10 行。

head(filter(birthwt, age > 35, bwt < 2500 | bwt > 4000),10)

函數(shù) slice( ) 可以按照行號(hào)選擇指定的行。例如,下面的命令選擇數(shù)據(jù)集里面的第 2 行到第 5 行。

slice(birthwt, 2:5)

2.使用 arrange( ) 排列行

有時(shí)候我們想要將數(shù)據(jù)框的記錄按照某個(gè)變量進(jìn)行排序,函數(shù) arrange() 可以實(shí)現(xiàn)這個(gè)功能。下面的命令將數(shù)據(jù)框按照變量 bwt 的值從小到大進(jìn)行排序后顯示:

arrange(birthwt, bwt) # 默認(rèn)升序

在上面的輸出中,第 6 行和第 7 行的變量 bwt 的值都是 1588,在這種情況下如果還想將數(shù)據(jù)框按照第二個(gè)變量排序,只需要在函數(shù) arrange( ) 里加上第二個(gè)變量即可。例如,下面的命令將數(shù)據(jù)框按照變量 bwt 的值從小到大排序,在 bwt 取值相等的情況下再按照第二個(gè)變量 age 的值從小到大排序。

arrange(birthwt, bwt, age)

如果想把數(shù)據(jù)框按照某個(gè)變量的值從大到小進(jìn)行排序,可以借助函數(shù) desc( ) 實(shí)現(xiàn)。

arrange(birthwt, desc(bwt))
# 等價(jià)于
arrange(birthwt, - bwt)

3. 使用 select( ) 選擇列

函數(shù) select( ) 用于選擇數(shù)據(jù)框中的列(變量)。

# 下面的命令選擇數(shù)據(jù)框里面的 bwt、age、race 和 smoke 這 4 個(gè)變量組成新的數(shù)據(jù)框。
select(birthwt, bwt, age, race, smoke)

請(qǐng)注意,MASS 包里有一個(gè)同名函數(shù) select( ),如果同時(shí)加載了 dplyr 包和 MASS 包,R 會(huì)默認(rèn)使用較后加載的包里的函數(shù)。為了避免混淆,我們可以使用符號(hào) :: 特別指明使用某一個(gè)包里的函數(shù),例如 dplyr::select( )。之后我們將會(huì)對(duì)函數(shù) select( ) 作進(jìn)一步介紹。

4.使用 mutate( ) 添加新變量

函數(shù) mutate( ) 用于在數(shù)據(jù)框中創(chuàng)建新的變量。下面的命令將數(shù)據(jù)集 birthwt 里的變量 lwt(單位:lb)乘以系數(shù) 0.4536 后生成新的變量 lwt.kg(1lb ≈ 0.4536kg)。

# 當(dāng)然如果想要用新變量替換原來(lái)的變量,只需把新變量命名為原來(lái)的變量名:
mutate(birthwt, lwt.kg = lwt*0.4536)

5.使用 summarise( ) 計(jì)算統(tǒng)計(jì)量

函數(shù) summarise( ) 可以用于計(jì)算數(shù)據(jù)框中某個(gè)變量的指定統(tǒng)計(jì)量。

例如,計(jì)算變量 bwt 的樣本均值和樣本標(biāo)準(zhǔn)差:

summarise(birthwt, Mean.bwt = mean(bwt), Sd.bwt = sd(bwt))

6. 使用 group\_by( ) 拆分?jǐn)?shù)據(jù)框

函數(shù) group_by( ) 可以將數(shù)據(jù)框按照某一個(gè)或某幾個(gè)分類(lèi)變量拆分成多個(gè)數(shù)據(jù)框。例如:

group_by(birthwt, race)
str(group_by(birthwt, race))
# ============ 輸出 =============
grouped_df [189 × 10] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ low  : int [1:189] 0 0 0 0 0 0 0 0 0 0 ...
 $ age  : int [1:189] 19 33 20 21 18 21 22 17 29 26 ...
 $ lwt  : int [1:189] 182 155 105 108 107 124 118 103 123 113 ...
 $ race : int [1:189] 2 3 1 1 1 3 1 3 1 1 ...
 $ smoke: int [1:189] 0 0 1 1 1 0 0 0 1 1 ...
 $ ptl  : int [1:189] 0 0 0 0 0 0 0 0 0 0 ...
 $ ht   : int [1:189] 0 0 0 0 0 0 0 0 0 0 ...
 $ ui   : int [1:189] 1 0 0 1 1 0 0 0 0 0 ...
 $ ftv  : int [1:189] 0 3 1 2 0 0 1 1 1 0 ...
 $ bwt  : int [1:189] 2523 2551 2557 2594 2600 2622 2637 2637 2663 2665 ...
 - attr(*, "groups")= tibble [3 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ race : int [1:3] 1 2 3
  ..$ .rows: list<int> [1:3] 
  .. ..$ : int [1:96] 3 4 5 7 9 10 15 16 18 20 ...
  .. ..$ : int [1:26] 1 17 29 30 31 33 35 41 43 70 ...
  .. ..$ : int [1:67] 2 6 8 11 12 13 14 19 21 24 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE

函數(shù) group\_by( ) 不會(huì)改變數(shù)據(jù)框的外觀,而會(huì)改變它與其他 dplyr 動(dòng)詞函數(shù)的作用方式 。因此,上面的輸出結(jié)果看上去和原來(lái)的數(shù)據(jù)框沒(méi)有什么差別,但實(shí)質(zhì)上是不同的。最本質(zhì)的差別是多了一個(gè)分組屬性(Groups),即上面的結(jié)果包含了 3 個(gè)數(shù)據(jù)框,分別對(duì)應(yīng)于變量 race 的 3 個(gè)類(lèi)別。

你還可能注意到上面輸出對(duì)象的格式(grouped_df [189 × 10] (S3: grouped_df/tbl_df/tbl/data.frame))。與 R/Rstudio 上不同,notebook 這里把它顯示成了 A grouped_df: 189 × 10(而非 # A tibble: 189 x 10),實(shí)際它仍然包含 tibble(注意其中的 - attr(*, "groups")= tibble [3 × 2] (S3: tbl_df/tbl/data.frame))。另外,它沒(méi)有顯示 Groups 屬性信息,實(shí)際應(yīng)為 # Groups: race [3]。

tibble 是 tidyverse 系列包(包括 dplyr 包)提供的一種類(lèi)似數(shù)據(jù)框的格式。相對(duì)于傳統(tǒng)的數(shù)據(jù)框,tibble 在很多方面具有優(yōu)勢(shì),感興趣的讀者可以參閱函數(shù) tibble( ) 的幫助文檔。我們可以用函數(shù) as_tibble( ) 將傳統(tǒng)的數(shù)據(jù)框轉(zhuǎn)換為 tibble,也可以用函數(shù) as.data.frame( ) 將 tibble 轉(zhuǎn)換成傳統(tǒng)的數(shù)據(jù)框。

as_tibble(birthwt)

下面我們將會(huì)看到,把函數(shù) group\_by( ) 和 summarise( ) 聯(lián)合使用能方便地對(duì)變量進(jìn)行分組統(tǒng)計(jì)。

7. 使用傳遞符 %>% 組合多個(gè)操作

我們經(jīng)常需要對(duì)一個(gè)數(shù)據(jù)框做一系列的操作,后面一個(gè)操作的輸入需要用前一個(gè)操作的輸出結(jié)果。

# 第一步把數(shù)據(jù)框 birthwt 里面的變量 race 轉(zhuǎn)換成因子并給各個(gè)水平添加標(biāo)簽,把新的數(shù)據(jù)框命名為 birthwt1
birthwt1 &lt;- mutate(birthwt, 
                   race = factor(race, labels = c("white", "black", "other")))
# 第二步把數(shù)據(jù)框 birthwt1 按照變量 race 分組,把分組后的對(duì)象命名為 birthwt.group; 
birthwt.group &lt;- group_by(birthwt1, race)
# 第三步對(duì)于分組對(duì)象 birthwt.group 計(jì)算各組中變量 bwt 的平均值。
summarise(birthwt.group, mean(bwt))

這種方法的最大缺點(diǎn)是需要為每個(gè)中間結(jié)果建立一個(gè)變量。在很多情況下,比如在上面的示例中,這些中間變量其實(shí)是沒(méi)有什么實(shí)際意義的。我們需要給這些中間變量命名,而且這些中間變量會(huì)保存在工作空間中占用內(nèi)存。傳遞操作符 %>% 將該符號(hào)之前的對(duì)象傳遞給符號(hào)后面的函數(shù)并作為函數(shù)的第一個(gè)參數(shù)值。例如:

c(2, 4, 6, 8) %&gt;% matrix(nrow = 2)

因?yàn)?dplyr 包里面的函數(shù)第一個(gè)參數(shù)總是數(shù)據(jù)框,所以這些函數(shù)配合傳遞操作符處理數(shù)據(jù)框非常方便。下面用傳遞操作符改寫(xiě)上面的命令:

birthwt %>%
  mutate(race = factor(race, labels = c("white", "black", "other"))) %>%
  group_by(race) %>%
  summarise(mean(bwt))

上述代碼的重點(diǎn)在于動(dòng)詞函數(shù),而不是函數(shù)中的參數(shù)。在閱讀這一串代碼組合時(shí),可以將它們當(dāng)成一系列的規(guī)定動(dòng)作。

項(xiàng)目實(shí)戰(zhàn)

epiDisplay 包里的數(shù)據(jù)集 Planning 來(lái)自 20 世紀(jì) 80 年代中期泰國(guó)的一項(xiàng)計(jì)劃生育調(diào)查研究,請(qǐng)通過(guò)其幫助文件查看數(shù)據(jù)信息并整理該數(shù)據(jù)集。

library(epiDisplay)
data(Planning)
print(des(Planning))
names(Planning) <- tolower(names(Planning))   # 把變量名變?yōu)樾?xiě)字母
summary(Planning)
table(duplicated(Planning$id))       # 查看是否有重復(fù)id;
# FALSE  TRUE 
#   250     1
which(duplicated(Planning$id))       # 找出重復(fù)id的行號(hào);把 XXXXXX 替換成正確的代碼
#   216
Planning$id # 驗(yàn)證下
Planning$id[216] <- 216  # 修正重復(fù)id;
library(dplyr)
Planning <- mutate(
  Planning,
  relig = ifelse(relig == 9, NA, relig),     # 將變量relig中的9變成NA
  ped = ifelse(ped == 0 | ped == 9, NA, ped), # 將變量ped中的0和9變成NA
  income = ifelse(income == 9, NA, income),   # 將變量income中的9變成NA
  am = ifelse(am == 99, NA, am),           # 將變量am中的99變成NA
  reason = ifelse(reason == 9, NA, reason),  # 將變量reason中的9變成NA
  bps = ifelse(bps == 0 | bps == 999, NA, bps), # 將變量bps中的0和999變成NA
  bpd = ifelse(bpd == 0 | bpd == 999, NA, bpd), # 將變量bpd中的0和999變成NA
  wt = ifelse(wt == 0 | wt > 99, NA, wt),    # 將變量wt中的0和大于99的值變成NA
  ht = ifelse(ht == 0 | ht > 300, NA, ht)    # 將變量ht中的0和大于300的值變成NA;
)

以上就是R語(yǔ)言之dplyr包常用函數(shù)方法示例學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于R語(yǔ)言dplyr包函數(shù)方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論