スタートページ> JavaScript> 他言語> R言語
主要関数
sum(v) 合計
var(v) 不偏分散:偏差平方和を(データ数-1)で割った値,
sd(v) 標準偏差:不偏分散の生の平方根
apply(m, side=1/2, 関数) 行・列への関数の適用
cov(m) 共分散行列
cor(m) 相関行列
sort(v) ソート
order(v) 順序つけ
det(m) 行列式の値
t(m) 転置行列
solve(m) 逆行列
eigen(m) 固有値、固有ベクトル
length() 要素数 max() 最大値、min() 最小値, mean() 算術平均, median() 中央値, quantile() 分位点, range() 範囲:最大値から最小値の差, sum() 合計, var() 不偏分散:偏差平方和を(データ数-1)で割った値, sd() 標準偏差:不偏分散の生の平方根
# ベクトル
v <- c(30, 20, 50, 10, 40)
sum(v) # 150
# 行列
# [,1] [,2] [,3]
m <- matrix(c(11, 12, 13, # [1,] 11 12 13
21, 22, 23), # [2,] 21 22 23
nrow=2, byrow=T)
sum(m) # 102
sum(m[1, ]) # 36 11+12+13
sum(m[ , 1]) # 32 11+21
# 行列 apply関数
#一般形 apply(配列, MARGIN, 関数) # 戻り値はベクトル
# MARGIN = 1 行対象
# 2 列対象
# c(1,2) 全要素
apply(m, 1, sum) # 36 66 11+12+13 21+22+23
apply(m, 2, sum) # 32 34 36 11+21 12+22 13+23
# データフレーム
df <- data.frame( # c1 c2
c1 = c(11, 21, 31), # 1 11 12
c2 = c(12, 22, 32)) # 2 21 22
# 3 31 32
df.sum() # エラー
sum(df) # 129
sum(df['c1']) # 63
sum(df$c1) # 63
apply(df, 2, sum) # c1 c2
# 63 66
分散や相関を求めるには、基本統計関数を組み合わせて求めることもできますが、次の関数を使えば簡単に記述できます。
var() # 不偏分散 不偏分散と同じ
cov() # 共分散行列
cor() # 相関行列
cov2cor() # 共分散行列を相関行列に変換する関数
このような処理では、データフレームが広く用いられるので、それを入力データとします。出力は matrix になります。
df <- data.frame(体重=c( 56, 70, 75, 68, 58, 64, 53, 68, 65, 59),
身長=c(168,181,178,179,171,174,174,178,179,169),
腹囲=c( 65, 78, 83, 75, 72, 72, 67, 78, 69, 73))
var(df) # 不偏分散
# 体重 身長 腹囲
# 体重 48.26667 24.71111 33.42222
# 身長 24.71111 20.98889 14.86667
# 腹囲 33.42222 14.86667 30.17778
cov(df) # 分散共分散行列 不偏分散と同じ
# 体重 身長 腹囲
# 体重 48.26667 24.71111 33.42222
# 身長 24.71111 20.98889 14.86667
# 腹囲 33.42222 14.86667 30.17778
m <= cov(df)
m["身長","体重"} # 24.71111
m[2,1] # 24.71111
cor(df) # 相関行列
# 体重 身長 腹囲
# 体重 1.000000 0.776379 0.875725
# 身長 0.776379 1.000000 0.590711
# 腹囲 0.875725 0.590711 1.000000
cov2cor(cov(df)) # 体重 身長 腹囲
# 体重 1.000000 0.776379 0.875725
# 身長 0.776379 1.000000 0.590711
# 腹囲 0.875725 0.590711 1.000000
# 単純ソート sort
v <- c(50, 30, 20, 40)
sort(v) # 昇順 20 30 40 50
sort(v, decreasing=T) # 降順 50 40 30 20
# 順序つけ order
v <- c(50, 30, 20, 40)
k <- order(v) # 3 2 4 1
# ↑
# k[1]=v[3]=20
# k[2]=v[2]=30
# k[3}=v[4]=40
# k[4]=v[1]=50
order(-v) # 降順 1 4 2 3
# 入力
# [,1] [,2] [,3] [,4]
m <- matrix(c(5,3,1,4, # [1,] 5 3 1 4
3,4,1,3, # [2,] 3 4 1 3
3,1,3,1, # [3,] 3 1 3 1
4,2,4,3), # [4,] 4 2 4 3
ncol=4, byrow=T)
# 列をキーにしたソート 一般形 行列[order(行列[,キー列]), ]
# 列1をキーにして昇順にソート
order(m[,1]) # 2 3 4 1
# 他の行もこの順序にする
m[order(m[,1]), ] # [,1] [,2] [,3] [,4]
# [1,] 3 *4 1 3
# [2,] 3 *1 3 1
# [3,] 4 2 4 3
# [4,] 5 3 1 4
# └ キー列 昇順
# 複数のキー列によるソート
# 一般形 行列[order(行列[,キー列1], 行列[, キー列2], 行列[, キー列3], …)]
# 列1を順位1、列2を順位2としてソート
m[order(m[,1], m[,2]), ]
# [,1] [,2] [,3] [,4]
# [1,] 3 *1 3 1 * の行が入れ替わった
# [2,] 3 *4 1 3
# [3,] 4 2 4 3
# [4,] 5 3 1 4
# 行をキーとしたソート 一般形 行列[, order(行列[キー行, ])]
# 行1の降順でソート
order(m[1,], decreasing=T) # 降順 1 4 2 3
m[ , order(m[1,], decreasing=T)] # [,1] [,2] [,3] [,4]
# [1,] 5 4 3 1 降順ソート
# [2,] 3 3 4 1
# [3,] 3 1 1 3
# [4,] 4 3 2 4
本来、データフレームは並びの順序は問わない形式なのですが、出力の見やすさなどのためにソートすることがあります。
行をキーとするソートは、実務的には稀ですので省略します。列をキーとするソートは、行列とほぼ同じです。
# c1 c2 c3 c4
df <- data.frame(c1=c(5, 3, 3, 4), # r1 5 3 1 4
c2=c(3, 4, 1, 2), # r2 3 4 1 3
c3=c(1, 1, 3, 4), # r3 3 1 3 1
c4=c(4, 3, 1, 3)) # r4 4 2 4 3
rownames(df) <- c('r1','r2','r3','r4')
# c1列を順位1、c2列を順位2としてソートします。
df[order(df$c1,df$c2), ] # c1 c2 c3 c4
# r3 3 1 3 1
# r2 3 4 1 3
# r4 4 2 4 3
# r1 5 3 1 4
# [,1] [,2]
m <- matrix(c(2, 3, # [1,] 2 3
1, 2), # [2,] 1 2
nrow=2, byrow=T)
det(m) # 1 (= 2x2 - 3x1)
m <- matrix(c(11, 12, 13,
21, 22, 23),
nrow=2, byrow=T)
t(m) # [,1] [,2]
# [1,] 11 21
# [2,] 12 22
# [3,] 13 23
# [,1] [,2]
m <- matrix(c(2, 3, # [1,] 2 3
1, 2), # [2,] 1 2
nrow=2, byrow=T)
solve(m) # [,1] [,2]
# [1,] 2 -3
# [2,] -1 2
次の連立一次方程式の解を求めます。
2x + 3y = 7
1x + 2y = 4
# 方程式の定義
m <- matrix(c(2, 3,
1, 2),
nrow=2, byrow=T) # 係数
b <- c(7, 4) # 定数項
# 求解
解 <- solve(m) %*% b # 内積
解[1] # 2 (=x)
解[2] # 1 (=y)
# [,1] [,2]
m <- matrix(c(2, 3, # [1,] 2 3
1, 2), # [2,] 1 2
nrow=2, byrow=T)
eigen(m) # eigen() decomposition
# $values
# [1] 3.7320508 0.2679492
# $vectors
# [,1] [,2]
# [1,] 0.8660254 -0.8660254
# [2,] 0.5000000 0.5000000
結果 <- eigen(m)
固有値 <- 結果$values
固有ベクトル <- 結果$vectors
固有値[1] # 3.7320508
固有ベクトル[1,2] # -0.8660254