R言語

【R言語】データフレーム操作 作成・値の代入・行と列の追加と削除など

  1. HOME >
  2. R言語 >

【R言語】データフレーム操作 作成・値の代入・行と列の追加と削除など

スポンサーリンク

R言語を使う際に避けては通れない道であるデータフレームの操作について解説します。

データフレーム(data.frame)はデータセットを格納するための行列であり、データ解析をするうえで必要不可欠です。

この記事では、下記のデータフレームの基本的な操作:作成や値の参照・代入、行と列の追加や削除などを一通りまとめています。

この記事で学べる事

  • データフレームの作成
  • データフレームの参照
  • データフレームの要素の取得
  • データフレームの要素の変更
  • 行名・列名の変更
  • 行と列の追加・挿入・削除
  • データフレームの結合
  • データフレームの並び替え・ソート
  • データフレームの転置(行と列の逆転)
  • 欠測値の処理
  • 行と列の合計・割合・平均・分散
  • データフレームからピボットテーブルを作成
  • データフレームのファイルへの保存

データ整形する際に必要な知識を網羅することができます。

この記事で扱うプログラミングコードは以下からダウンロードすることができます。テンプレートとして使ってもらって構いません。

ベクトルの操作方法については次の記事でまとめています。

【R言語】ベクトルの操作 作成・値の代入・要素の追加など

R言語のベクトルの操作(作成や参照、代入、要素の追加など)をまとめました。 この記事では以下のベクトルに関する操作を実行例付きで分かりやすく解説しています。 この記事で学べる事 ベクトルの作成 ベクト ...

続きを見る

データフレームの操作について見ていきます。作成や値の参照・代入、行と列の追加や削除だけでなくデータフレームのソートや欠測値などについてもまとめています。

実行例を全部載せた結果、ものすごい量になってしまったので複数のページに分けて操作方法を解説しています。

各ページの内容

  • 1ページ目でデータフレームの作成と参照、要素の取得、要素の変更
  • 2ページ目で行名・列名の変更、行と列の追加と削除、データフレームの結合、並び替え
  • 3ページ目でデータフレームの転置、欠測値の処理、合計や割合など、ピボットテーブルの作成、データフレームの保存

を扱っています。

 

 

データフレームの作成

データフレームの作成するには関数data.frameを使います。

data.frameの引数を何も指定しない場合、0行0列のデータフレームのを作成することができます。

0行c列やr行0列のデータフレームする際は、関数matrixの引数nrowncolをそれぞれrとcに指定した後に、[, 0]や[0, 1]で0列または0行の行列を作ります。この行列をdata.frameに渡すことで作成することができます。

引数にベクトルを複数並べることで、そのベクトルを列にもつデータフレームを作成することが可能です。また、行列の形を保ったままデータフレームに変換することもできます。

データフレームの参照

データ解析をする前に、データセットがどのような変数から構成されているのか知りたいときがよくあります。

関数headとtailを用いることでデータフレームの先頭と末尾の要素を確認することが可能です。

また、次のように引数nを指定することで、どこまで参照するか指定することが可能です。

また、行名や列名を知りたいときはrownamesやcolnames、dimnamesを用います。以下、関数の概要です。

  • rownamesで行名
  • colnamesで列名
  • dimnamesで行名と列名のリスト

また、次はrownamescolnamesの実行例です。

これらの関数を使うことでデータフレームがどのような変数から構成されているのか把握することができます。

データフレームの要素の取得

データフレームの要素の参照方法をいくつかに分けて紹介します。

後の要素の変更および代入で紹介しますが、データフレームの要素の参照には次の3通りの方法があります。

  • インデックスで指定する方法
  • 行名や列名で指定する方法
  • 真偽値(logical型)で指定する方法

それぞれの利点を実行例とともに説明していきます。

インデックスで指定

まず、一番簡単な指定方法であるインデックスについて見ていきます。

データフレームdfの要素を参照する方法を次のリストにまとめました。

  • 5行2列の要素を参照したいときは、df[5, 2]
  • 3行目を取得したいときは,df[3, ]
  • 3から5行目を取得したいときは、df[seq(3, 5), ]
  • 2列目を取得したいときは、df[, 2]
  • 1列目と2列目を取得したいときは、df[, c(1, 2)]
  • 3から5行目かつ1と2行目を取得したいときは、df1[seq(3, 5), c(1, 2)]

上に示すように、行や列単位で取得したいときは、行や列に対応する要素を指定しないで参照したい行や列のインデックスを与えれば大丈夫です。

また、複数の行を取得したいときは、ベクトルを与えてあげます。

さらに、行と列にインデックスのベクトルを与えることで、データフレームのその行と列が交差する部分を取得することができます。

インデックスで指定するのは簡単ですが、例えば解析するデータセットの列の順番が変わったり行の順番が変わってしまうと、いちいち書き直さなければいけないという手間がかかります。

また、全てインデックスで指定してしまうとプログラミングコードがマジックナンバーだらけになってしまい、何を描いているのか分かりません。

コードの質的にもよろしくないので、インデックスで指定する方法はあまりお勧めしません。

この次に紹介する名前で指定する方法真偽値で指定する方法をお勧めします。

行名や列名で指定

続いて行名や列名で指定する方法について見ていきます。データセットに行名や列名があれば、上のインデックスで指定する方法を頼らずにすべての操作が可能です。

名前をプログラミングコードで書いているので、どこで何の処理を行っているのかパッと見分かりやすく、インデックスよりおススメです。この指定方法に慣れましょう。

行名や列名でデータフレームの要素を参照する方法を以下にまとめます。

  • 行名"id:1"の行かつ列名"letters"を参照したいときは、df["id:1", "letters"]
  • 行名"id:1"の行を取得したいときは、df["id:1", ]
  • 行名"id:1"から"id:5"の行を取得したいときは、df[paste0("id:", seq(1, 5)), ]
  • 列名"letters"の列を取得したいときは、df[, "letters"]
  • 行名"id:1"から"id:5"の行かつ列名"numbers"と"letters"の列を取得したいときは、df[paste0("id:", seq(1, 5)), c("numbers", "letters")]
  • 3から5行目かつ1と2行目を取得したいときは、df1[seq(3, 5), c(1, 2)] 

インデックスのように参照したい行名や列名を与えることで参照が可能です。行名や列名1つのみでなく、ベクトルを与えることで複数の行と列を取得することもできます。

列に関してはdf$lettersのように、データフレームの後ろに$を付けて列を取得することもできます。

真偽値で指定

データフレームのある条件を満たす要素を参照したいときに、真偽値で指定する方法が凄い便利です。

logical型のベクトルをデータフレームの大括弧の行と列に入れることで、logical型のTRUEの部分が交差する要素を参照することができます。何を言っているのか分からないと思うので、次の具体例で説明します。

2行目と3行目でlogical型のベクトルを与えています。データフレームのこのベクトルを与えると、1から5行目かつ1列目と2列目を取得することができました。

このようにTRUEであるインデックスの要素を参照することができます。これを用いることで次の特定の条件を満たすデータフレームの要素の参照が可能になります。この真偽値による指定は、例えばデータフレームにnumeric型の変数があって、「ある数値に等しい」または「a以上b以下」である行を取得したい場合に重宝します。

  • 列numbersが5である行を取得したいときは、df[df$numbers == 5, ]
  • numbersが3から7かつlettersが"d"または"f"である行を取得するときは、df[df1$numbers >= 3 & df1$numbers <= 7 & df1$letters == "d" | df1$letters == "f", ]
  • 列名が"logicals"でない列を取得したいときは、df1[, colnames(df1) != "logicals"]
  • 列名に"l"が含まれる列を取得するときは、df1[, grepl("l", colnames(df1))

データフレームの要素の変更

データフレームの要素の取得の3通りの方法を使うことでデータフレームの要素の変更が可能です。

インデックスでの指定、名前での指定、真偽値での指定の3通りの方法について見ていきます。

インデックスで指定

データフレームの5行目2列目を変更したいときは次のようにします。

5行2列目の"e"が"abcdefg"に変更されているのが分かります。

行単位で要素を変更したい場合は、列のインデックスを指定せずに変更したい行のインデックスを与えればおkです。

次のコードの1行目でデータフレームの3行目を変更し、2行目では4から6行目を変更しています。複数の行を変更する際はベクトルを与えましょう。

同様に、列単位での変更が可能です。次のコードの1行目でデータフレームの2列目の変更を、2行目で1と2列目の変更を行っています。

行と列にベクトルのインデックスを与えることで次のようにデータフレームの一部を変更することができます。次を実行するとデータフレームの3から5行目かつ1と2列目が変更されます。

行名や列名で指定

次に、名前でデータフレームを変更する方法について紹介します。

行名でデータフレームを変更する際は、データフレームの行に行名を指定します。次を実行すると行名が"id:1"である行(1行目)が変更されます。

同様に列名で列を変更することができます。列名の場合はデータフレームの後ろに$をつけることで変更することもできます。

また、ある行名と列名の2つを指定することで、それらの行と列が交差する要素を変更することが可能です。次は行名"id:5"かつ列名"letters"の要素の変更の例です。

また次のように複数の行と列の変更も可能です。行名と列名のベクトルをデータフレームに与えることで、複数の行と列を変更することができます。

行名と列名のベクトルを両方指定すると、次のようにその行名と列名に関する複数の要素変更することができます。

真偽値で指定

最後にlogical型で変更する方法について見ていきます。次のように、logical型のベクトルをデータフレームに与えるとTRUEの部分について変更することができます。

また、「ある変数がaと等しい」行「a以上b以下」である行の変更を行いたいときは、次のように論理演算をデータフレームの中で行えばおkです。

次のように複雑な論理演算でも大丈夫です。次はnumbersが3から7かつlettersが"d"または"f"の行の変更を行っています。

同様に、列に関してもlogical型で変更できます。次では、列名が"logicals"でない列の変更と、列名に"l"が含まれている列の変更を行っています。

次のページへ >

スポンサーリンク

  • この記事を書いた人
  • 最新記事

usagi-san

統計学とゲームとかをメインに解説していくよ。 数式とかプログラミングコードにミスがあったり質問があったりする場合はコメントで受け付けます。すぐに対応します。

-R言語
-,