忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


# データ生成
dat <- data.frame(s = factor(1:8), a = factor(c(rep(1,4), rep(2, 4))), b1 = rnorm(8), b2 = rnorm(8), b3 = rnorm(8))
dat

library(reshape)
# 縦長にする
dat.l <- melt(dat, id = c("s", "a"))
dat.l

# 横長にする
## 結果はvalue, 反復測定変数はvariableという変数名でないとエラーになる
names(dat.l) # 変数名のチェック
[1] "s" "a" "variable" "value"
cast(dat.l)

PR
# 最頻値
xn <- sample(1:100, 1000, replace=T)
xf <- factor(sample(letters[1:5], 1000, replace=T))

# 数値変数の場合
x <- xn
hist(x, plot=F, right=F)$breaks[order(hist(x, plot=F, right=F)$counts, decreasing=T)][1]
# 確認用
hist(xn, plot=F)

# 因子変数の場合
x <- xf
names(table(x))[order(as.vector(table(x)), decreasing=T)][1]
# 確認用
table(xf)


# 等差数列の生成 seq
seq(from=, to=, by=)

# 反復生成 rep
rep(1:3, times = 3) # 1,2,3を3回繰り返す。rep(1:3, 3) も同じ
rep(1:3, each = 3) # それぞれを3回くりかえす
## 繰り返しは要素ごとに指定もできる
rep(1:3, times = c(3, 2, 5))
## 因子変数を指定した数だけ複数つくる
gl(n=3, k=20, labels=c("control", "treatmentA", "treatmentB")) # ordered=Tで順序尺度に

# ランダムサンプリング sample
sample(x=ベクトル, size=総数, replace=F:同じ要素が選ばれても良いか, prob=NULL:確率ベクトル
## 5件法のデータを100個生成する
sample(x=5, size=100, replace=T)
## prob引数。確率ベクトルとして3が半分とかのデータにする。デフォルトは一様
p <- c(0.1, 0.1, 0.5, 0.1, 0.2)
table(sample(x=5, size=100, replace=T, prob=p)) # tableで集計

## 正規分布っぽい乱数生成
# msmパッケージのptnorm関数を使用して上限と下限を設定した正規分布をつくり、それを5等分して各確率密度を求め, pr.vに入れる
pr.v <- vector("numeric", 5)
library(msm)
for (i in 1:5) {
pr.v[i] <- ptnorm(q=i+1, mean=3.5, sd=1, lower=1, upper=6) - ptnorm(q=i, mean=3.5, sd=1, lower=1, upper=6)
}
pr.v
## pr.vに従って1-5までの乱数を生成する
x <- sample(1:5, 10000, replace=T, prob=pr.v)
table(x)


# 組み合わせ用 combn, choose 組合せ
5水準の要因で、2水準ごとの組み合わせ
x <- gl(5, 20) # 各サンプルサイズは20とする。特に意味はない
x.lvl <- levels(x)
combn(x.lvl, 2)
# 何通りあるか
x.nm <- nlevels(x)
choose(x.nm, 2)
# 複数の因子の交互作用的な組み合わせ?
y <- gl(3, 20, labels=c("a", "b", "c"))
interaction(x, y)
## 組み合わせの種類
levels(interaction(x, y))



# 行列、データフレームの先頭、末尾をとりだす
head(dat)
tail(dat)


# 特定の行、列を除いたり、逆に取り出したりする
dat[-2,] # 2行目を除く
dat[,-2] # 2列目を除く
dat[c(1,3,5),] # 1,3,5行を取り出す
dat[,c(1:10)] # 1列目から10列目までを取り出す

# 特定のデータを取り出す
x <- sample(1:5, 100, replace=T)
## 1だけ取り出す
x[x==1]
## 1がいくつかるか数えるには
x==1 # こうするとTRUE/FALSEが返される
sum(x==1) # T/Fは01データとしても扱われるのでsumで調べることができる
which(x==1) # ベクトル内の位置を返す


# subset関数を用いて抽出
## サンプルデータ
dat <- data.frame(id= paste("ps", 1:20, sep=""), sex=sample(c("m", "f"), 20, replace=T), age=sample(20:70, 20, replace=T))
## 男性だけ取り出す
subset(dat, sex=="m")
## 30以上70以下だけ取り出す
subset(dat, age>=30 & age<=70)
## 30以上70以下の男性だけ取り出す
subset(dat, sex=="m" & (age>=30 & age<=70))
## 30以上70以下の男性のidだけ取り出す。select引数を使う
subset(dat, sex=="m" & (age>=30 & age<=70), select=id)

## 因子変数と数値変数が混在しているデータフレームで、因子だけのと数値だけのデータフレームに分ける
# データの準備
f1 <- sample(letters[1:5], 20, replace=T)
f2 <- ordered(sample(letters[11:15], 20, replace=T))
f2["Levels"] # これは順序変数にしてみよう
n1 <- sample(500:1000, 20, replace=T)
n2 <- sample(rnorm(100), 20, replace=T)
f3 <- sample(letters[21:25], 20, replace=T)
dat <- data.frame(f1, f2, n1, n2, f3)
summary(dat)
sapply(dat, class)

# 因子変数はdatfへ、それ以外 (数値) はdatiへ
fcol <- grep("factor", sapply(dat, class))
datf <- dat[,c(fcol)]
dati <- dat[,-c(fcol)]
datf
dati

# 重複するデータを除く
## サンプルデータ
dat <- data.frame(
id=gl(5, 10, labels=c("s1", "s2", "s3", "s4", "s5")),
sex=rep(c("f", "f", "m", "m", "f"), each=10),
age=rep(c(18:22), each=10)
)
aggregate(dat[2:3], list(dat[,1]), function(x) x[1])
# きっともっといいやり方があるだろう

# データの並べ替え

## ベクトルの処理
x <- c(1,3,5,6,4,2)
rev(x) # 逆順に並べ替え
sort(x) # 小さい順に並べ替え
sort(x, decreasing=T) # 大きい順に並べ替え。sort(x, T) でも可
order(x) # 小さい順の添え字
x[order(x)] # sort(x) と同じ


## サンプルデータ
dat <- data.frame(v1=1:12, v2=rep(c(4,2,9), each=4), v3=rep((rep(c(2,1), each=2)), 3))
dat

# 変数v2で並べ替え
dat[order(dat$v2),]

# v2とv3で並べ替え
dat[order(dat$v2, dat$v3),]

# v2は降順、v3は昇順
dat[order(-dat$v2, dat$v3),]


## ソートの例2。データフレームの並べ替え処理
## サンプルデータ
a <- paste("a", sample(1:10,10), sep="")
b <- paste("b", sample(1:10,10), sep="")
dat <- data.frame(round(matrix(rnorm(100), nr=10),2))
colnames(dat) <- a
rownames(dat) <- b
dat

## 列名で並べ替える
dat[,order(colnames(dat))]

## 行名で並べ替える
dat[order(rownames(dat)),]

## 列1で並べ替える
dat[order(dat[,1]),] # カンマは後ろにつく。列の数値で行を並べ替えるので

## 行1で並べ替える
dat[,order(dat[1,])] # カンマは前につき、dat[1,]につく。行の数値で列を並べ替えるので


# データのマージ
## サンプルデータ
dat1 <- data.frame(id=paste("ps", 1:10, sep=""), v1=rnorm(10), v2=gl(2, 5, label=c("ga", "gb")), v3=sample(1:5, replace=T))
dat2 <- data.frame(id=paste("ps", 101:110, sep=""), v2=gl(2, 5, label=c("gb", "gc")), v3=sample(1:5, replace=T)) # id重複なし
dat3 <- data.frame(id=paste("ps", 1:6, sep=""), v5=rnorm(6)) # id重複

# 縦にくっつける
merge(dat1, dat2, all=T)
merge(dat1, dat3, all=T)

# 横にくっつける
cbind(dat1, dat2)
data.frame(dat1, dat2) # 自動で重複する変数名を変えてくれる

# 計算関数
abs() 絶対値
ceiling() 切り上げ
floor() 切り下げ
trunc 整数部分を抜き出す
round 四捨五入
sin, cos, tan サイン、コサイン、タンジェント
log 自然対数
log10 常用対数
exp 指数
 










## その他
# 割り算の余りをとる
x %% y
# 割り算の商をとる
x %/% y
# 角度を与えてサインコサインタンジェントを得るにはaspaceパッケージの関数を使う
library(aspace)
sin_d()
cos_d
tan_d()

# 文字列操作
substr(x, start= , stop=) 文字列の抽出
grep(pattern=, x, ignore.case=, fixed=) オブジェクト内の文字列を検索する。patternに一致するxの位置を返す。
sub(pattern=, replacement=, x, ignore.case=, fixed=) 文字列内の特定の文字のの置換
strsplit(x, split=) 文字列の分割
paste(..., sep=) 文字列の結合。# paste("Ps", 1:10, sep="")
toupper 大文字にする
tolower 小文字にする
abbreviate() 短くする。# abbreviate(names(iris))













# 統計関数
x <- trunc(rnorm(1000, mean=100, sd=10))
mean(x) # 平均
sd(x) # 不偏標準偏差
median(x) # 中央値
quantile(x) # クォンタイル値
range(x) # 範囲
sum(x) # 合計
min(x) # 最小値
max(x) # 最大値
scale(x) # 変数の標準化
scale(x, center=T, scale=F) # 変数の中心化
 # 調和平均
library(psych)
harmonic.mean(ベクトル)


# 確率分布
確率分布関数の覚書
d... distribution。分布関数曲線の数式。確率密度関数のこと
p... percentile 。特定のポイントでの面積 (積分) 。よく斜線が引いてあるアレ
q... quantile。ある確率密度のときの横軸 (標準得点の値) 。よく1.96とか使われるアレ
r... random。特定の分布に基づいて乱数を発生させる (例えば正規分布に基づく乱数だと、平均0、標準偏差1になる)
## 正規分布曲線
x <- seq(-4, 4, 0.01) # 最小値-4, 最大値4、0.01刻みのベクトル
curve(dnorm(x, 0, 1), -4, 4) # ベクトルxについて、平均0、標準偏差1の曲線を描く
プロフィール
HN:
tao
HP:
性別:
非公開
職業:
会社員
趣味:
アウトドア、自転車、ジョギング、英語学習
自己紹介:
・千葉在住のサラリーマンです。データ分析っぽいことが仕事。
・今年英検1級取得。今はTOEIC高得点を目指して勉強中。
・興味のあることは野球、アウトドア、英語学習、統計、プログラミング、PC関係などなど。
ブログ内検索
freead
順位表
プロ野球データFreak
セリーグ順位表
パリーグ順位表