Menu

R のデータフレーム: 作成、確認、列へのアクセス

データフレームは R の表計算シートです。長さの等しい名前付きの列があり、それぞれが独自の型を持ちます。作成方法、str() と head() による把握、列・行・セルへのアクセス方法を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

データフレームは列のリストである

データフレームは R の表です。行は観測、列は変数を表します。R における表計算シートであり、実務のデータがほぼ必ず取る形です — 1 人につき、1 測定につき、1 取引につき 1 行。属性ごとに 1 列。

構造的には、データフレームは長さの等しいベクトルの リスト に、行と列の振る舞いを重ねたものです。この 1 つの事実がその規則のほとんどを説明します。各列は単一の型を持ち(ベクトルだから)、列どうしは 異なる 型を持てて(リストだから)、すべての列は同じ長さでなければなりません(それが「フレーム」の部分です)。

名前付きベクトルを data.frame() に渡して作成します。

テキスト、数値、論理値が隣り合って並んでいます — 行列には収められない組み合わせです。実際には、このように手でデータを打ち込むことはめったにありません。表は通常 read.csv やデータベース経由で届きます。しかし以下の内容は、データフレームがどこから来たかに関係なくまったく同じように当てはまります。

データフレームの全体像をつかむ

見ていないデータセットで計算を始めてはいけません。R の確認用ツールは短く、反射的に使えるようにする価値があります。

  • str() は新しく読み込んだデータに対して最初に実行すべきものです。列ごとに 1 行、型と最初の値を表示します。1 つの紛れ込んだ項目のせいで実際には文字列として読み込まれてしまった「数値」の列を捕まえられる場所です。
  • nrow() / ncol() は次元を返し、names() は列名を列挙します。
  • summary() は列ごとの統計を返します — 数値なら最小値/中央値/平均/最大値、論理値と因子なら件数です。
  • head(df)tail(df) は最初と最後の 6 行を表示します。実データが全体を表示するには大きすぎるようになると欠かせません。以下では組み込みデータセットに対する head() の実例を見ます。

列を取り出す 3 つの方法

列へのアクセスは日々の基本操作であり、R は 3 つの書き方を用意しています。

  • people$age — 日常的な形式です。短く、読みやすく、多くのエディタで補完が効きます。
  • people[["age"]] — 結果は同じですが、名前を変数から与えられます(col <- "age"; people[[col]])。これは $ にはできません。関数の内部ではこちらを使いましょう。
  • people[, "age"] — 行列スタイルです。カンマの前が行(空ならすべて)、後が列です。

3 つとも列を素の ベクトル として返すので、mean(people$age) にそのまま渡せます。スニペットの 4 番目の書き方が罠です。角括弧 1 つの people["age"] はベクトルではなく 1 列の データフレーム を返します。これはリストが持つ [[[ の区別と同じもので、データフレームが実際にリスト である からです。数学関数が「入力が数値でない」と文句を言ったら、角括弧を確認しましょう。

行とセル

[行, 列] の記法で表の任意の切り出しに到達できます。

people[2, ] は 2 行目全体です(型が混在するため、行はフレームの形を保ち 1 行のデータフレームになります)。people[2, "name"] は単一のセルです。行番号のベクトルを渡せば複数行を取り出せます。

重要なのは最後の行です。列に対する論理条件は を選択します — ここでは 28 歳より上の全員です。この「行にマスクをかける」パターンは R におけるすべてのデータ絞り込みの基礎であり、独立した記事に値します。subset() や複数条件のフィルタを含む完全な解説は フィルタと部分抽出 を参照してください。

列の追加と削除

データフレームは列のリストなので、列は単純な代入によって出入りします。

新しい名前に代入すると列が追加されます。ベクトルは nrow() と一致しなければなりません(あるいは長さ 1 で、全行を埋めるように再利用されます)。2 つ目の追加は定石を示しています。既存の列から計算した新しい列 を、列全体に対するベクトル化された演算で一度に作るのです。NULL を代入すると列は完全に削除されます。

列の値も同じ方法で上書きできます — people$age <- people$age + 1 は全員を 1 歳年上にします。

組み込みデータセットと tibble について

R には練習用のデータセットが最初から読み込まれており、何もインポートせずに上記のすべてを試せます。どのチュートリアルでも出会う 2 つは mtcars(32 台の車、11 個の数値変数)と iris(150 本の花、4 つの測定値と種を表す 因子)です。

ここで head() が本領を発揮します。6 行あれば、画面を埋め尽くさずに対象の形が分かります。これらのデータセットは理想的な遊び場です。ある関数の挙動が分からないときは、自分のデータに向ける前に mtcars で試しましょう。

tidyverse に触れるとすぐ出会う用語があります。tibble — データフレームに対する tidyverse なりの解釈です。概念は同じで、振る舞いがより礼儀正しくなっています。表示は最初の 10 行と列の型のみで、名前の部分一致もありません。tibble() で作るか、readr / dplyr の関数が返します。

library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#>   name    age
#>   <chr> <dbl>
#> 1 Rosa     30
#> 2 Ken      41

この記事のすべて — $str()、列の追加、論理値による行マスク — は tibble でもそのまま動きます。tibble は磨きをかけたデータフレーム そのもの です。データフレームを学べば、両方を学んだことになります。

この記事のまとめ

  • データフレームは長さの等しい列のリストです。列ごとに 1 つの型、表全体では型が混在する — R の表計算シートです。
  • 計算の前に確認しましょう: まず str()、次に head()summary()nrow()/ncol()/names()
  • df$coldf[["col"]]df[, "col"] はいずれも列をベクトルとして返します。角括弧 1 つの df["col"] はデータフレームを返します。
  • df[rows, cols] で何でも切り出せます。カンマの前の論理マスクは行を絞り込みます。
  • 列は代入で追加し(多くは他の列から計算します)、NULL で削除します。mtcars で練習しましょう。

次は 欠損値 — NA が何を意味し、なぜ計算全体に広がるのか、そしてどう扱うかです。

よくある質問

R でデータフレームを作成するにはどうすればよいですか?

長さの等しい名前付きベクトルを data.frame() に渡します: df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41))。各ベクトルが 1 つの列になります。実際には、ほとんどのデータフレームは手入力ではなく read.csv() やデータベースから届きますが、構造は同じです。

R のデータフレームで列にアクセスするにはどうすればよいですか?

3 つの方法があります: df$age(手軽で読みやすい)、df[["age"]](同じ結果で、列名が変数に格納されている場合に使える)、df[, "age"](行列スタイル)。いずれも列を素のベクトルとして返します。角括弧 1 つの df["age"] は代わりに 1 列のデータフレームを返すため、混乱の元になりがちです。

データフレームに対して str() は何を表示しますか?

列ごとに 1 行で、名前、型、最初のいくつかの値を表示し、先頭には行数と列数が出ます。ある列が数値として読み込まれたのかテキストとして読み込まれたのかを確認する最速の方法であり、だからこそ新しく読み込んだデータセットに対して最初に実行すべきなのが str() です。

R でデータフレームに列を追加するにはどうすればよいですか?

まだ存在しない名前に代入します: df$score <- c(88, 75, 93)。ベクトルは行数と一致している必要があります(あるいは長さ 1 で、全行に再利用されます)。列を削除するには NULL を代入します: df$score <- NULL

Coddy programming languages illustration

Coddyでコードを学ぼう

始める