R言語でデータフレームをマージする

記事とコードは [Github ウェアハウス: https://github.com/timerring/dive-into-AI ]にアーカイブされています。または、公開アカウント [AIShareLab] はR 言語に返信することで取得することもできます。

場合によっては、データ セットが複数の場所から取得され、2 つ以上のデータ セットを 1 つにマージする必要があります。データ フレームを結合する操作には、垂直結合、水平結合、および共通変数に基づく結合が含まれます。

1. 垂直マージ: rbind()

rbind( )2 つのデータ フレームを垂直方向に結合するには、関数を使用できます。マージされる 2 つのデータ フレームには同じ変数が必要です。この種のマージは通常、観測値をデータ フレームに追加するために使用されます。例えば:

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

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

rbind(data1, data2)

2. 水平マージ: cbind ()

cbind( )2 つのデータ フレームを水平方向に結合するには、関数を使用できます。マージに使用される 2 つのデータ フレームは、同じ行数で、同じ順序である必要があります。この種の結合は、データ フレームに変数を追加するためによく使用されます。例えば:

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

cbind(data1, data3)

3. 共通変数に従ってマージします: merge()

場合によっては、1 つ以上の共通変数を持つ複数の関連データ セットがあり、それらを共通変数に基づいて大規模なデータ セットにマージしたいことがあります。関数 merge() はこの関数を実装できます。たとえば、次のようになります。

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

full_join( )

dplyr パッケージの full_join() 関数でも上記の機能を実現できます。上記のコマンドは次と同等です。

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

dplyr パッケージは、bind_rows()、bind_cols()、left_join()、right_join() など、データ フレームをマージするためのさまざまな関数を提供します。これらの関数の使用法を理解するには、これらの関数のヘルプ ドキュメントを確認してください

4. データフレームの長さと幅の形式の変換

基本パッケージの関数は、reshape( )ロング形式とワイド形式の間でデータを変換できます。

以下の説明では、データセット パッケージ内のデータセット Indometh を例として取り上げます。このデータセットはインドメタシンという薬物の薬物動態データに関するもので、被験者は計6名で、各被験者が連続8時間以内に定期的に血中薬物濃度を測定した合計11回の測定値です。素材はロングフォーマットですが、以下はワイドフォーマットに変換されます。

data(Indometh)
head(Indometh,12) # 这里增加一行,预览数据前 12 行,方便对比

wide <- reshape(Indometh, v.names = "conc", idvar = "Subject", timevar = "time", direction = "wide")
wide
  • Indometh: これは、変形操作の対象となる元のデータを表すデータ フレームまたはデータセットです。
  • v.names: これは、再形成される値変数の名前を表す文字列です。この場合、"conc"は元のデータの濃度変数を表します。
  • idvar: これは、変数を識別する変数の名前またはリストを表す文字列またはベクトルです。この場合、"Subject"は元のデータ内のサブジェクト識別変数を表します。
  • timevar: これは時間変数の名前を表す文字列です。この場合、"time"は元のデータの時間変数を表します。
  • direction: 変形の方向を示す文字列です。この場合、"wide"は、データをロング形式からワイド形式に再形成することを意味します。

ワイド形式のデータをロング形式に再変換することもできます。

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

reshape() 関数は強力ですが、パラメーターが多く、使用するのが少し不便です。

tidyrこのパッケージは、データのロング形式とワイド形式の変換を比較的簡潔で統一された形式で実装しており、そのうち、 関数はpivot_wider( )ロング形式データをワイド形式に変換するために使用され、 関数はpivot_longer( )ワイド形式データをロング形式に変換するために使用されます。上記の結果は、次のコマンドでも取得できます。

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

上記の関数 pivot_wider( ) では、関数 as.data.frame( ) を使用してデータ Indometh をデータ フレームに変換していることに注意してください。これは、そのデフォルトのタイプがデータ フレームではないためです。データ フレーム幅を長い形式に変換し直すこともできます。

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

「整然とした」データ セット (整然としたデータ) は、次の条件を満たす必要があります。各行は観測値を表し、各列は変数を表します。R のほとんどの関数はこの形式のデータをサポートしているため、医療データを分析する前に、通常はデータ セットを長い形式に変換する必要があります。

gather()また、tidyr パッケージでは、spread()ロングおよびワイドのデータ型変換にも使用できます。詳細については、 Cookbook for Rを参照してください。

おすすめ

転載: blog.csdn.net/m0_52316372/article/details/132512344