Rのデータ型と演算

公開

2026年4月23日

更新日

2026年4月27日

Rの基礎的なデータ操作方法(データ型とその演算)を紹介します。

データ型

Rでよく使うデータ型には、数値型、論理型、文字列型、因子型、日付型などがあります。

# 数値型
1
3.14
# 論理型
TRUE
FALSE
# 文字列型
"apple"
"123"
# 因子型、日付型などはまた後日…
ヒントコメント・アウト

Rのコードにおいて、行の先頭に#記号があると、Rはその行の内容を評価(実行)しません。 なので、Rのコード中になんらかのメモやコメントを残したい場合に、この#記号を使うことができます。

行の先頭に#記号を挿入することをコメント・アウトといいます。 専用のキーボード・ショートカットも用意されていて、Windowsは[Ctrl]+[Shift]+[C]、Macは[Command]+[Shift]+[C]です。 コメント・アウトを解除するのにも、同じキーボード・ショートカットを使います。

演算

演算

Rで四則演算をやってみましょう。

# 足し算
7 + 3
[1] 10
# 引き算
7 - 3
[1] 4
# 掛け算
7 * 3
[1] 21
# 割り算
7 / 3
[1] 2.333333
# 割り算(商)
7 %/% 3
[1] 2
# 割り算(余り)
7 %% 3
[1] 1
# 冪乗
7 ** 3
[1] 343
# これも冪乗
7 ^ 3
[1] 343

大小関係や等号・不等号などの関係演算は、以下のように実行します。 演算結果は、TRUEもしくはFALSEの論理型データになります。

# 大小関係
7 > 3
[1] TRUE
7 < 3
[1] FALSE
# 等号・不等号
7 == 3
[1] FALSE
7 != 3
[1] TRUE

NOTANDORなどの論理演算は、以下のようにします。

# NOT(否定)
!TRUE
[1] FALSE
!FALSE
[1] TRUE
# AND(論理積)
TRUE & TRUE
[1] TRUE
TRUE & FALSE
[1] FALSE
# OR(論理和)
TRUE | TRUE
[1] TRUE
TRUE | FALSE
[1] TRUE

数学関数

Rには、例えば以下のような数学関数が用意されています。

# 平方根
sqrt(2)
[1] 1.414214
# 自然対数
log(10)
[1] 2.302585
# 常用対数
log10(100)
[1] 2
# 指数関数
exp(1)
[1] 2.718282
# 丸める
round(pi, 2)
[1] 3.14
# 切り上げ(天井関数)
ceiling(pi)
[1] 4
# 切り下げ(床関数)
floor(pi)
[1] 3
ヒントRの定数

Rにも、他のプログラミング言語と同様に、いくつかの定数が用意されています。

pi   # 円周率
Inf  # 無限大(Infinity)
NULL # 空値
NaN  # 非数(Not a Number)
NA   # 欠損値(Not Available)

このうちNAは、一般的なプログラミング言語では見かけることのない定数で、欠損値のための定数が用意されているというのは、統計解析のための言語であるRの特徴だといえるでしょう。

代入

Rで変数に値を代入するには、<-->を使います(->はあまり使いません)。 =でも代入できます(<-=のどちらを使うかは、好みです)。

x <- 7
y <- 3
z <- x / y
z
[1] 2.333333
x <- x ** 2
x
[1] 49
z = sqrt(x)
z
[1] 7
1 / y -> z
z
[1] 0.3333333

ベクトル

Rのプログラミング言語としての特徴の1つは、ベクトルや行列が扱いやすいことです。

ベクトルの作成

Rのベクトルは、数学のベクトルとほとんど同じ概念で、同じ型のデータが、2つ以上まとめたデータです。 数学のベクトルと違って、数値型以外の型(例えば文字列型)のデータもまとめてベクトルにすることができます。

いろいろな方法でベクトルを作成することができます。

# 要素を結合
c(2, 4, 6)
[1] 2 4 6
# 整数の並び
2:6
[1] 2 3 4 5 6
# 連続する数の間隔を指定
seq(2, 5, by = 0.5)
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0
# ベクトルを繰り返す
rep(1:2, times = 3)
[1] 1 2 1 2 1 2
# ベクトルの要素を繰り返す
rep(1:2, each = 3)
[1] 1 1 1 2 2 2

ベクトル関数

ベクトルを引数にとる関数もあります。

x <- c(3, 6, 2, 5, 1, 3)
# 合計
sum(x)
[1] 20
# 平均
mean(x)
[1] 3.333333
# 標準偏差
sd(x)
[1] 1.861899
# 並べ替え
sort(x)
[1] 1 2 3 3 5 6
# 逆順
rev(x)
[1] 3 1 5 2 6 3
# ユニークな値
unique(x)
[1] 3 6 2 5 1
# 各要素の個数
table(x)
x
1 2 3 5 6 
1 1 2 1 1 
# ベクトルの長さ(要素の数)
length(x)
[1] 6

ベクトルの演算

ベクトルの演算では、要素ごとの演算の結果を格納したベクトルが得られます。

x <- c(2, 4, 6, 8)
y <- c(1, 2, 3, 4)
# 足し算
x + y
[1]  3  6  9 12
# 引き算
x - y
[1] 1 2 3 4
# 掛け算
x * y
[1]  2  8 18 32
# 割り算
x / y
[1] 2 2 2 2
# 商
x %/% y
[1] 2 2 2 2
# 余り
x %% y
[1] 0 0 0 0
ヒント長さの異なるベクトルの演算

ベクトルの長さが異なる場合、長いベクトルの長さが短いベクトルの長さの倍数ならば、短いベクトルを繰り返して演算されます。

x <- c(2, 4, 6, 8)
y <- c(1, 2)
z <- c(1, 2, 1, 2) # zはyを2つつなげたベクトル
x / y # yが短いので、yを2つつなげたベクトルで演算
[1] 2 2 6 4
x / z # yを2つつなげたベクトルで演算した結果と同じ
[1] 2 2 6 4
y <- 2 # スカラー
x / y # xの要素をそれぞれ2で割る演算になる
[1] 1 2 3 4

ベクトルの要素を取り出す

ベクトルの要素を取り出すさまざまな方法があります。

x <- c(3, 6, 2, 5, 1, 3)
# 4番目の要素
x[4]
[1] 5
# 4番目以外の要素
x[-4]
[1] 3 6 2 1 3
# ベクトルで位置を指定
x[1:2]
[1] 3 6
x[c(1, 4)]
[1] 3 5
x[-(1:2)]
[1] 2 5 1 3
# 値による指定
x[x == 3]
[1] 3 3
x[x >= 5]
[1] 6 5
# 集合に含まれる要素
x[x %in% c(1, 3, 5)]
[1] 3 5 1 3
ヒント%in%演算子

%in%演算子は、値のマッチングに関する二項演算子です。 演算子の左側の要素が、右側の要素(通常はベクトル)に含まれるかどうかを表す論理型データ(TRUEもしくはFALSEを返します。例えば、

1 %in% c(1, 2, 4)
[1] TRUE
3 %in% c(1, 2, 4)
[1] FALSE

演算子の左型をベクトルにすると、ベクトルの要素それぞれについての%in%の結果を、ベクトルで返します。

c(1, 3) %in% c(1, 2, 4)
[1]  TRUE FALSE

上の例では、

x %in% c(1, 3, 5)
[1]  TRUE FALSE FALSE  TRUE  TRUE  TRUE
x[c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE)]
[1] 3 5 1 3

の結果が表示されているということです。

データ型の変換

x <- c(1, 0, 1)
# データ型の確認
class(x)
[1] "numeric"
# 論理型に変換
y <- as.logical(x)
y 
[1]  TRUE FALSE  TRUE
# 論理型データはTRUEを1にFALSEを0として算術演算できる
sum(y)
[1] 2
# 文字列型に変換
z <- as.character(x)
z
[1] "1" "0" "1"
# 文字列型を数値型に変換
as.numeric(z)
[1] 1 0 1
type.convert(z, as.is = TRUE)
[1] 1 0 1

リスト

いろいろなデータ型を持つ要素を、まとめて1つのリストにすることができます。

リストの作成

z <- list(x = 1:3, y = c("a", "b"))
z
$x
[1] 1 2 3

$y
[1] "a" "b"

リストの要素を取り出す

# リストzの2番目の要素
z[[2]]
[1] "a" "b"
# リストzの名前がyの要素
z$y
[1] "a" "b"

データフレーム

データフレームは、分析に使うデータを保持する構造として、最も一般的なものの1つです。 スプレッドシート上でデータを管理するときのように、列名(colmun name)と行番号(row index) を持つ2次元配列の格好をしています。

データフレームの作成

データベースをつくるには、data.frame関数を使います。以下の表のようなデータを持つデータフレームをつくるコードを示します。

names division wins draws losses goals_for goals_against
Avispa J1 12 14 12 33 38
Giravanz J3 15 11 12 41 39
Sagan J1 10 5 23 48 68
V-Varen J2 21 12 5 74 39
Roasso J2 13 7 18 53 62
Trinita J2 10 13 15 33 47
Tegevajaro J3 12 10 16 46 50
United FC J2 7 9 22 35 59
teams <- data.frame(
  names         = c("Avispa", "Giravanz", "Sagan", "V-Varen", "Roasso", "Trinita", "Tegevajaro", "United FC"),
  division      = c("J1", "J3", "J1", "J2", "J2", "J2", "J3", "J2"),
  wins          = c(12, 15, 10, 21, 13, 10, 12,  7),
  draws         = c(14, 11,  5, 12,  7, 13, 10,  9),
  goals_for     = c(33, 41, 48, 74, 53, 33, 46, 35),
  goals_against = c(38, 39, 68, 39, 62, 47, 50, 59)
)
teams
       names division wins draws goals_for goals_against
1     Avispa       J1   12    14        33            38
2   Giravanz       J3   15    11        41            39
3      Sagan       J1   10     5        48            68
4    V-Varen       J2   21    12        74            39
5     Roasso       J2   13     7        53            62
6    Trinita       J2   10    13        33            47
7 Tegevajaro       J3   12    10        46            50
8  United FC       J2    7     9        35            59

ただし、実際の分析ではデータは外部ファイルから読み込むことが多く、このようにコードを書いてデータフレームを作成する場面は少ないとは思います(外部ファイルからデータを読み込む方法は、後ほど紹介します)。

データフレームの操作

データフレームの大きさ(行数と列数)を知るには、dim関数を使います。 行数のみを出力するnrow関数や、列数のみを出力するncol関数もあります。 これらから、teamsは8行6列のデータフレームであることがわかります。

# 行数と列数
dim(teams)
[1] 8 6
# 行数
nrow(teams)
[1] 8
# 列数
ncol(teams)
[1] 6

データフレームから要素を抽出するには、以下に示すような方法があります。

# 行番号と列番号を指定する
teams[3, 2]
[1] "J1"
# 行を抜き出す
teams[c(2, 3), ]
     names division wins draws goals_for goals_against
2 Giravanz       J3   15    11        41            39
3    Sagan       J1   10     5        48            68
# 列を抜き出す
teams[, 1]
[1] "Avispa"     "Giravanz"   "Sagan"      "V-Varen"    "Roasso"    
[6] "Trinita"    "Tegevajaro" "United FC" 
teams[, "names"]
[1] "Avispa"     "Giravanz"   "Sagan"      "V-Varen"    "Roasso"    
[6] "Trinita"    "Tegevajaro" "United FC" 
teams$names
[1] "Avispa"     "Giravanz"   "Sagan"      "V-Varen"    "Roasso"    
[6] "Trinita"    "Tegevajaro" "United FC" 
# 値が条件を満たすものを抜き出す
teams[teams$division == "J1", ]
   names division wins draws goals_for goals_against
1 Avispa       J1   12    14        33            38
3  Sagan       J1   10     5        48            68
teams[teams$goals_against > 60, ]
   names division wins draws goals_for goals_against
3  Sagan       J1   10     5        48            68
5 Roasso       J2   13     7        53            62