新しい変数をつくる

付置演算子 <- で新しい変数を生成できる。演算子組み込み関数 も参照。

# 以下3例は全て同じ結果を返す。

mydata$sum <- mydata$x1 + mydata$x2
mydata$mean <- (mydata$x1 + mydata$x2)/2

attach(mydata)
mydata$sum <- x1 + x2
mydata$mean <- (x1 + x2)/2
detach(mydata)

mydata <- transform( mydata,
sum = x1 + x2,
mean = (x1 + x2)/2
)


変数の再コード化

連続変数を因子変数にする。中央値分割して高群と低群に分けるとか。演算子 (">=", "<") を使うやり方とcut関数を使うやり方がある。覚えてしまえばcut関数が楽。

制御構文も参照。

cut関数の使い方の覚書

# 参考:連続変数をカテゴリー変数に変換する

# データ生成
x <- c(10,20,30,40,50, trunc(rnorm(45, m=30, sd=5)))

# 範囲を指定して分割する
# 10刻みで分割しよう
## 刻み幅、最大値、最小値を指定しておく
sqv <- 10
minv <- 10
maxv <- 50

# 分割
seqs <- seq(minv, maxv, sqv)
brks <- c(-Inf, seqs, Inf)
gs <- paste(c("-", seqs), c(seqs, "-"), sep="-")
## カテゴリー生成
cats <- cut(x, breaks=brks, right=FALSE, include.lowest=TRUE, labels=gs) # ~以上~未満 (right=FALSE), 最大値を含める (include.lowest=T)))
# 確認
data.frame(x, cats)
barplot(table(cats))

# 中央値で分割する。中央値も〜未満、以上〜にする
# 中央値を確認
median(x)
gs <- c("low", "high")
# カテゴリー生成
cats <- cut(x, breaks=c(-Inf, median(x), Inf), right=FALSE, include.lowest=TRUE, labels=gs)
# 確認
data.frame(x, cats)
barplot(table(cats))

# 中央値と四分位数で4分割する
seqs <- quantile(x)[2:4] # quantile関数で四分位数と中央値を取り出す
brks <- c(-Inf, seqs, Inf)
gs <- paste(c("-", seqs), c(seqs, "-"), sep="-")
# カテゴリー生成
cats <- cut(x, breaks=brks, right=FALSE, include.lowest=TRUE, labels=gs)
# 確認
data.frame(x, cats)
barplot(table(cats))

# 平均値とsdで6分割する
sdv <- sd(x)
mv <- mean(x)
seqs <- c(mv-2*sdv, mv-sdv, mv, mv+sdv, mv+2*sdv)
seqs2 <- c("m2sd", "m1sd", "avg", "p1sd", "p2sd")
brks <- c(-Inf, seqs, Inf)
gs <- paste(c("-", seqs2), c(seqs2, "-"), sep="-")
# カテゴリー生成
cats <- cut(x, breaks=brks, right=FALSE, include.lowest=TRUE, labels=gs)
# 確認
data.frame(x, cats)
barplot(table(cats))

# とにかく10分割
brks <- 10
gs <- letters[1:brks] # 適当にグループ名
cats <- cut(x, breaks=brks, right=FALSE, include.lowest=TRUE) # 確認
data.frame(x, cats, gs)
barplot(table(cats))

# 70より上か下かで年齢のカテゴリーを2つつくる。
age <- sample(20:100, 20, replace=T) # 仮想データ生成
agecat <- ifelse(age > 70, c("older"), c("younger"))
age; agecat

# 別の例。カテゴリー3つ
agecat[age > 75] <- "Elder"
agecat[age > 45 & age <= 75] <- "Middle Aged"
agecat[age <= 45] <- "Young"
age; agecat

例2

# サンプルデータ
x <- trunc(rnorm(30, m=100, sd=10))

# 90未満、90以上110未満、110以上でlow, middle, highにする
# cut関数よりも楽で以上、未満、以下が定義しやすい
nx <- x
nx[x >= 110] <- "high"
nx[x >= 90 & x < 110] <- "middle"
nx[x < 90] <- "low"
x
nx <- factor(nx) # 順序尺度にするときはordered(nx, levels=c("high", "middle", "low"))

# cut関数でコード化
x <- trunc(rnorm(30, m=100, sd=10))
## 中央値分割
cut(x, breaks=c(-Inf, median(x), Inf), label=c("LOW", "HIGH"), right=T, ordered_result=T)
## ordered_result=Tとすると順序尺度になる。分割は以上-未満で行われる。right=Tとしないとへんな結果になる



変数の名前を変える

# fix関数でデータエディタを開き、インタラクティブに変える。
fix(mydata)

# reshapeパッケージのrename関数で変える。
x <- iris
names(x)
library(reshape)
x2 <- rename(x, c(Sepal.Length="newname"))
names(x2)

# 自分でnames属性を入力する。そのたびに全部の名前を入力しないといけないので面倒。
names(x2)
names(x2) <- c("newnm", "x1","age","y", "ses")
names(x2)


ダミー変数の生成

x <- gl(5, 4, labels=c("high", "mid", "low", "out", "ukn"))
lvs <- levels(x)
nlv <- nlevels(x)
x.dmy <- data.frame(matrix(0, nrow=20, ncol=5))
for (i in 1:nlv) {
x.dmy[,i] <- as.integer(x==lvs[i])
}
data.frame(x.dmy, x)


## 青木先生のmake.dummy関数 ##
# データはデータフレームで渡す。データが1列しかないデータフレームには対応していない。
source("http://aoki2.si.gunma-u.ac.jp/R/src/make.dummy.R", encoding="euc-jp")
x <- gl(5, 4, labels=c("high", "mid", "low", "out", "ukn"))

# 1列だとうまくいかない
x1 <- data.frame(x)
make.dummy(x1)

# 2列だとダミー変数を生成できる。
x2 <- data.frame(x,x)
make.dummy(x2)