jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

R言語でデータフレームの一部を参照する方法

今回は、データフレームオブジェクトの一部を取り出す方法を紹介します。ほんの少しの違いですが、取り出した結果を他の処理に利用するときには重要な違いになるので、割と大事な内容です。

R言語のオブジェクト

R言語では、いろいろな構造のオブジェクト(ベクトル、マトリックス、データフレームなど)があります。オブジェクトを宣言する際に、構造指定を明示しません。これによって気軽にオブジェクトを宣言できる一方、構造指定の失敗によるエラーに気づきにくというデメリットがあります。複数の変数を含める場合には、マトリックスかデータフレームを用います。この2つのオブジェクトの違いとして、マトリックスはすべての変数のデータ型を揃える必要があるが、データフレームは異なるデータ型の変数を含められるところです。以下のコードを試すと数値型と文字列型のベクトルをマトリックス、データフレームのそれぞれに含めたときの振る舞いを確認できます。元々のデータの型を生かせるという意味では、データフレームの方が扱いやすいと言えます。

#2つ変数に対応するベクトル
a <- c(1,2,3)
b <- c("a","b","c")

#2つのベクトルのデータ型をチェック
class(a)
class(b)

# マトリックス
mat <- matrix(c(a,b),ncol =2)

#マトリックスのデータ構造をチェック
str(mat)

#データフレーム
df <- data.frame(x = a, y = b)

#データフレームのデータ構造をチェック
str(df)

データフレームオブジェクトからデータの取り出し

では、データフレームからデータを抽出する方法をいくつか示します。

取り出す変数の行を指定する

抽出したい変数が、データフレーム内の何列目にあるか知っていれば、列番号で取り出す変数を指定できます。

df <- data.frame(x =c("a","b","c"), y =  c(1,2,3))

#列番号指定によるyの抽出
df[,2]
取り出す変数の列名を指定する

抽出したい変数の名前を列名として指定する方法もあります。

df[,"y"]
取り出す変数名を$で指定する

$を使用する方法でも特定の変数を抽出できます。

df$y
リスト形式で指定する

列名ではなく、該当する変数を直接指定する方法もあります。列名を指定する場合との違いがわずかなので、書き方の違いに注意してください。

df["y"]

抽出方法の違いによるデータ構造の違い

いろいろなデータの取り出し方法があるのですが、方法によって、抽出されたデータの構造が異なります。以下のコードで見てみましょう。

#列番号指定
str(df[,
2])

#列名指定
str(df[,"y"])
str(df$y)

#リスト形式指定
str(df["y"])

上記を試すとリスト形式指定の場合は、抽出されたデータもデータフレーム構造を保持していることがわかります。その他の方法では、取り出されたデータがベクトルとなっています。

まとめ

以上で見たように、データフレームからデータを抽出する方法がいろいろあり、方法によっては、取り出されたデータの構造が異なることがあることを見てきました。例えば取り出したデータの平均値を計算したい場合mean関数を利用できるのは、上3つの方法で、リスト形式では直接mean関数の引数には指定できません。このような違いをきちんと押さえておくことで、バグを減らすことができるのではないかと思います。