R語言之?dāng)?shù)據(jù)框的合并

文章和代碼已經(jīng)歸檔至【Github倉庫:https://github.com/timerring/dive-into-AI 】或者【AIShareLab】回復(fù) R語言 也可獲取。

有時數(shù)據(jù)集來自多個地方,我們需要將兩個或多個數(shù)據(jù)集合并成一個數(shù)據(jù)集。合并數(shù)據(jù)框的操作包括縱向合并、橫向合并和按照某個共有變量合并。

1.縱向合并:rbind( )

要縱向合并兩個數(shù)據(jù)框,可以使用 rbind( )函數(shù)。被合并的兩個數(shù)據(jù)框必須擁有相同的變量,這種合并通常用于向數(shù)據(jù)框中添加觀測。例如:

data1 <- data.frame(id = 1:5, 
                    sex = c("female", "male", "male", "female", "male"),
                    age = c(32, 46, 25, 42, 29))
data1

[圖片上傳失敗...(image-d22c72-1693035975834)]

data2 <- data.frame(id = 6:10, 
                    sex = c("male", "female", "male", "male", "female"),
                    age = c(52, 36, 28, 34, 26))
data2

[圖片上傳失敗...(image-c17d6b-1693035975834)]

rbind(data1, data2)

2. 橫向合并:cbind ( )

要橫向合并兩個數(shù)據(jù)框,可以使用 cbind( ) 函數(shù)。用于合并的兩個數(shù)據(jù)框必須擁有相同的行數(shù),而且要以相同的順序排列。這種合并通常用于向數(shù)據(jù)框中添加變量。例如:

data3 <- data.frame(days = c(28, 57, 15, 7, 19),
                    outcome = c("discharge", "dead", "discharge", "transfer", "discharge"))
data3

cbind(data1, data3)

3. 按照某個共有變量合并:merge( )

有時我們有多個相關(guān)的數(shù)據(jù)集,這些數(shù)據(jù)集有一個或多個共有變量,我們想把它們按照共有變量合并成一個大的數(shù)據(jù)集。函數(shù) merge( ) 可以實現(xiàn)這個功能,例如:

data4 <- data.frame(id = c(2, 1, 3, 5, 4), 
                    outcome = c("discharge", "dead", "discharge", "transfer", "discharge"))
data4

mydata <- merge(data1, data4, by = "id")
mydata

[圖片上傳失敗...(image-fcd425-1693035975834)]

full_join( )

dplyr 包中的 full_join( ) 函數(shù)也能實現(xiàn)上述功能上面的命令等價于:

options(warn=-1) # 清爽顯示
library(dplyr)
mydata <- full_join(data1, data4, by = "id")
mydata

dplyr 包提供了多種用于合并數(shù)據(jù)框的函數(shù),例如 bind_rows( )、bind_cols( )、left_join( )、right_join( ) 等,你可以查看這些函數(shù)的幫助文檔了解它們的用法。

4. 數(shù)據(jù)框的長寬格式的轉(zhuǎn)換

基本包里的函數(shù) reshape( ) 可以對數(shù)據(jù)進行長寬格式之間的轉(zhuǎn)換。

下面以 datasets 包里的數(shù)據(jù)集 Indometh 為例進行說明。該數(shù)據(jù)集是關(guān)于藥物吲哚美辛(indometacin)的藥物代謝動力學(xué)數(shù)據(jù),一共有 6 名試驗對象,每名試驗對象在連續(xù)的 8 小時內(nèi)定時測定了血液中的藥物濃度,共有 11 次的測定值。該資料是長格式,下面將其轉(zhuǎn)換為寬格式。

data(Indometh)
head(Indometh,12) # 這里增加一行,預(yù)覽數(shù)據(jù)前 12 行,方便對比

[圖片上傳失敗...(image-f2c28b-1693035975834)]

wide <- reshape(Indometh, v.names = "conc", idvar = "Subject", timevar = "time", direction = "wide")
wide
  • Indometh:這是一個數(shù)據(jù)框或數(shù)據(jù)集,表示要進行重塑操作的原始數(shù)據(jù)。
  • v.names:這是一個字符串,表示要重塑的值變量的名稱。在這種情況下,"conc"表示原始數(shù)據(jù)中的濃度變量。
  • idvar:這是一個字符串或向量,表示標(biāo)識變量的名稱或變量列表。在這種情況下,"Subject"表示原始數(shù)據(jù)中的主體標(biāo)識變量。
  • timevar:這是一個字符串,表示時間變量的名稱。在這種情況下,"time"表示原始數(shù)據(jù)中的時間變量。
  • direction:這是一個字符串,表示重塑的方向。在這種情況下,"wide"表示要將數(shù)據(jù)從長格式重塑為寬格式。

[圖片上傳失敗...(image-88320b-1693035975834)]

我們還可以將寬格式數(shù)據(jù) wide 重新轉(zhuǎn)換為長格式:

long <- reshape(wide, idvar = "Subject", varying = list(2:12),
        v.names = "conc", direction = "long")
head(long, 12)

[圖片上傳失敗...(image-dfc3f7-1693035975834)]

函數(shù) reshape( ) 功能強大,但里面的參數(shù)很多,使用起來略顯不便。

tidyr 包以一種比較簡潔統(tǒng)一的格式實現(xiàn)數(shù)據(jù)長寬格式的轉(zhuǎn)換,其中,函數(shù) pivot_wider( ) 用于把長格式數(shù)據(jù)轉(zhuǎn)換為寬格式,而函數(shù) pivot_longer( ) 用于把寬格式數(shù)據(jù)轉(zhuǎn)換為長格式。上面的結(jié)果也可以用下述命令得到:

library(tidyr)
wide <- pivot_wider(as.data.frame(Indometh),
                    names_from = time,
                    values_from = conc)
wide

[圖片上傳失敗...(image-bd3da3-1693035975834)]

注意在上面的函數(shù) pivot_wider( ) 中,我們用函數(shù) as.data.frame( ) 將數(shù)據(jù) Indometh 轉(zhuǎn)換成了數(shù)據(jù)框,這是因為其默認類型不是數(shù)據(jù)框。數(shù)據(jù)框 wide 也能重新轉(zhuǎn)換為長格式:

long <- pivot_longer(wide, -Subject, 
                     names_to = "time", values_to = "conc")
long

[圖片上傳失敗...(image-271b5c-1693035975834)]

一個“整潔”的數(shù)據(jù)集(tidy data)應(yīng)該滿足:每一行代表一個觀測,每一列代表一個變量。在對醫(yī)學(xué)數(shù)據(jù)進行分析之前,通常情況下應(yīng)先把數(shù)據(jù)集轉(zhuǎn)換為長格式,因為 R 中的大多數(shù)函數(shù)都支持這種格式的數(shù)據(jù)。

tidyr 包中的 gather()spread() 同樣可以用于長型、寬型數(shù)據(jù)類型轉(zhuǎn)換,詳見 Cookbook for R。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容