0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rのデータ操作を10分で入門する

Last updated at Posted at 2025-04-28

この記事は

Rを触ったことがない人向けによくあるデータ操作をRのライブラリを使い、
どのように実行するのかをまとめました。
この記事を読めばRの基本的なデータ操作をマスターできます。
RにはPythonのPandas的なライブラリが3つあります。
まずはこの3つの使い分けから見ていきましょう。

ライブラリの選び方

用途 推奨ライブラリ
軽量で標準的な操作 data.frame(R標準)
大規模データ/高速処理 data.table
可読性・チェーン操作重視 tibble + dplyr(tidyverse)

基本セットアップとサンプルデータ

まず必要なライブラリを読み込み、サンプルデータを作成します:

# ライブラリ読み込み
library(tidyverse)
library(data.table)

# サンプルデータ作成
set.seed(123)
df <- tibble(
  id       = 1:12,
  category = rep(c("A","B","C"), each = 4),
  value    = c(5, 12, 7, 20,  3, 15, 8, 25, 10, 30, 2, 18),
  count    = sample(1:5, 12, replace = TRUE)
)
print(df)

# data.table用にデータフレームを変換
dt <- as.data.table(df)
print(dt)

data.frame による操作

dfの基本

data.frame では df[行指定, 列指定] 構文を使用して行と列を指定します:

# 基本構文: df[行指定, 列指定]
# 例: 最初の3行と、id・valueの列だけを選択
subset_example <- df[1:3, c("id", "value")]
print("=== 行と列の選択例 ===")
print(subset_example)

# 全ての行を選択する場合は空欄
all_rows_example <- df[, c("id", "category")]
print("=== 全ての行から特定の列を選択 ===")
print(all_rows_example)

# 全ての列を選択する場合も空欄
all_cols_example <- df[1:2, ]
print("=== 特定の行から全ての列を選択 ===")
print(all_cols_example)

1. 列の選択

特定の列だけを選択するには、列名のベクトルを指定します:

# id, category, value_per_count のみを選択
df_with_ratio <- transform(df, value_per_count = value / count)
df_selected <- df_with_ratio[, c("id", "category", "value_per_count")]

print(df_selected)

2. 列の追加

transform()を使って新しい列を追加できます:

# value を count で割った新しい列を追加
df_with_ratio <- transform(df,
  value_per_count = value / count
)

print(df_with_ratio)

3. データフレームの絞り込み

data.frameでは、条件に基づいて行を絞り込む際に df[条件, ] 構文を使用します:

# value が 10より大きい行を抽出
df_filtered <- df[df$value > 10, ]
print("=== df_filtered (value > 10) ===")
print(df_filtered)

4. グループ集計

aggregate()関数を使用して、グループごとの集計を行います:

# カテゴリごとに value の合計を計算
# フォーミュラ構文: 左辺(集計対象) ~ 右辺(グループ化キー)
total_value <- aggregate(value ~ category, data = df, FUN = sum)

# カテゴリごとに count の平均を計算
avg_count <- aggregate(count ~ category, data = df, FUN = mean)

# 結果を結合し、列名を変更
df_grouped <- merge(total_value, avg_count, by = "category")
names(df_grouped) <- c("category", "total_value", "avg_count")

print(df_grouped)

data.table による操作

data.tableの基本

data.tableは大規模データセットを効率的に処理するためのパッケージで、独自の構文 DT[i, j, by] を使用します:

  • i: どの行を選択するか(WHERE)
  • j: 何を計算/選択するか(SELECT)
  • by: どのグループで計算するか(GROUP BY)
# data.tableの基本構文: DT[i, j, by]
print("=== data.tableの基本例 ===")

# 例: value > 10の行から、idとcategoryのみを選択
basic_example <- dt[value > 10, .(id, category)]
print(basic_example)

# 例: categoryごとにvalueの合計を計算
group_example <- dt[, .(total_value = sum(value)), by = category]
print(group_example)

1. 列の選択

data.tableでは列を選択するために .(列名1, 列名2, ...) または list(列名1, 列名2, ...) 構文を使用します:

# id, category, value_per_count のみを選択
dt[, value_per_count := value / count]  # 一時的に列を追加
dt_selected <- dt[, .(id, category, value_per_count)]

print(dt_selected)

# 別の方法: j に列名のベクトルを使用
dt_selected2 <- dt[, c("id", "category", "value_per_count"), with = FALSE]
print(dt_selected2)

2. 列の追加

data.tableでは := 演算子を使って列を追加・変更します(参照セマンティクス):

# value を count で割った新しい列を追加
dt[, value_per_count := value / count]
print(dt)

# 複数の列を一度に追加
dt[, `:=`(
  squared_value = value^2,
  doubled_count = count*2
)]
print(dt)

3. データフレームの絞り込み

data.tableではiの位置に条件を指定して行を絞り込みます:

# value が 10より大きい行を抽出
dt_filtered <- dt[value > 10]
print("=== dt_filtered (value > 10) ===")
print(dt_filtered)

# 複数条件での絞り込み
dt_filtered2 <- dt[value > 10 & category == "A"]
print("=== dt_filtered2 (value > 10 & category == 'A') ===")
print(dt_filtered2)

4. グループ集計

data.tableでは by 引数を使用してグループ集計を行います:

# カテゴリごとに value の合計と count の平均を計算
dt_grouped <- dt[, .(
  total_value = sum(value),
  avg_count = mean(count)
), by = category]

print(dt_grouped)

# 複数の列でグループ化する場合
dt[, .(avg_value = mean(value)), by = .(category, count > 2)]

tidyverse による操作

パイプ演算子 %>% の基本

パイプ演算子は左側のオブジェクトを右側の関数の第1引数として渡します:

df %>% filter(value > 10)  # df を filter() の第1引数に渡す

例えば以下の処理:

df
id category value count
1  A        12    5
2  A        20    1
3  B        9     1
4  C        2     2
5  D        5     1

に対して:

df %>%
  filter(value > 10) %>%
  mutate(ratio = value / count) %>%
  select(id, ratio)

結果:

id ratio
1  2.4   # 12/5 = 2.4
2  20.0  # 20/1 = 20.0

1. 列の選択

select()関数で特定の列を選びます:

# id, category, value_per_count のみを選択
df_with_ratio <- df %>% mutate(value_per_count = value / count)
df_selected <- df_with_ratio %>%
  select(id, category, value_per_count)

print(df_selected)

2. 列の追加

mutate()関数で新しい列を追加できます:

# value を count で割った新しい列を追加
df_with_ratio <- df %>%
  mutate(
    value_per_count = value / count
  )

print(df_with_ratio)

3. データフレームの絞り込み

tidyverseではfilter()関数を使います:

# value が 10より大きい行を抽出
df_filtered <- df %>%
  filter(value > 10)

print(df_filtered)

4. グループ集計

group_by()summarise()を組み合わせます:

# カテゴリごとに value の合計と count の平均を計算
df_grouped <- df %>%
  group_by(category) %>%
  summarise(
    total_value = sum(value),
    avg_count = mean(count),
    .groups = "drop"  # 集計後にグループ化を解除
  )

print(df_grouped)

ライブラリ別性能比較

特徴 data.frame data.table tidyverse
速度 標準的 非常に高速 標準より少し速い
メモリ効率 標準的 非常に効率的 標準より少し効率的
構文の読みやすさ やや複雑 独特だが簡潔 非常に読みやすい
大規模データ向け ×
学習曲線 標準的 やや急 緩やか

最後に

  • data.frame: R標準のデータ操作で、[]による添字操作やaggregate()などの関数を使用
  • data.table: 大規模データ向けに最適化された高速処理が可能、DT[i, j, by]構文で簡潔かつパワフルな操作
  • tidyverse: パイプ演算子%>%を活用した直感的で読みやすいコード、select(), mutate(), filter(), group_by()などの関数で流れるようにデータ操作

それぞれのライブラリは特性に応じて使い分けることで、効率的なデータ分析が可能です。初心者は読みやすいtidyverseから始め、大規模データ処理が必要になったらdata.tableを検討するとよいでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?