データの選択・除外・抽出etc

変数や値を選んだり除外したりする。

# 例示データ
mydata <- data.frame(matrix(sample(1:100, 100, replace=T), nr=10, dimnames=list(c(1:10), c(paste("v", 1:10, sep="")))))
mydata


変数の選択

# select variables v1, v2, v3
myvars <- c("v1", "v2", "v3")
newdata <- mydata[myvars]
newdata

# another method
myvars <- paste("v", 1:3, sep="")
newdata <- mydata[myvars]
newdata

# select 1st and 5th thru 10th variables
newdata <- mydata[c(1,5:10)]
newdata


変数の除外

# exclude variables v1, v2, v3
myvars <- names(myvars) %in% c("v1", "v2", "v3")
newdata <- mydata[!myvars]
newdata

# exclude 3rd and 5th variable
newdata <- mydata[c(-3,-5)]
newdata

# delete variables v3 and v5
newdata <- mydata
newdata
newdata$v3 <- newdata$v5 <- NULL
newdata


観測値の選択

# 性別データ、年齢データ追加
mydata <- data.frame(matrix(sample(1:100, 100, replace=T), nr=10, dimnames=list(c(1:10), c(paste("v", 1:10, sep="")))))
gender <- sample(c("M", "F"), 10, replace=T)
age <- sample(20:80, 10, replace=T)
mydata <- data.frame(mydata, gender, age)
mydata

# first 5 observerations
newdata <- mydata[1:5,]
newdata

# based on variable values
newdata <- mydata[ which(mydata$gender=='F'
& mydata$age > 65), ]
newdata

# or
attach(newdata)
newdata <- mydata[ which(gender=='F' & age > 65),]
newdata
detach(newdata)


subset関数で選択する

一番簡単マジお勧め

# サンプルデータ
ID <- 1:100
age <- sample(5:60, 100, replace=T)
sex <- sample(c("m", "f"), 100, replace=T)
weight <- sample(20:150, 100)
height <- sample(20:150, 100)
income <- sample(20000:150000, 100)
mydata <- data.frame(ID, age, sex, weight, height, income)
mydata

# ageが20以上 or 10未満の人のID, weightだけもってくる
newdata <- subset(mydata, age >= 20 | age < 10, select=c(ID, weight))
newdata

# 25歳以上の男性でweight~incomeまでの変数をもってくる。等号を使うときはイコールを2つにすること
newdata <- subset(mydata, sex=="m" & age > 25, select=weight:income)
newdata


## 例2 ##
# サンプルデータ
  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)


無作為抽出

sample関数を使う

# ランダムサンプリング 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で集計


Going Further

サンプリングに関しては、sampling パッケージや、, survey パッケージ + ウェブサイト(複雑な調査データの解析) 、 bootstrapping (本サイト内) も参照のこと (とQuick-Rに書いてあった) 。

その他

データの一括置換

# NAを"UN"に置換する
dat[is.na(dat)] <- "UN"

# 0 をNAに置換する
0をnaに置換する: dat[dat==0]


因子変数と数値変数が混在しているデータフレームで、因子だけのと数値だけのデータフレームに分ける

# サンプルデータの準備
  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])

データの中央値分割

nx <- x
nx[x >= median(x)] <- "high"
nx[x < median(x)] <- "low"
nx <- factor(nx)
summary(nx)


その他抽出

# 行列、データフレームの先頭、末尾をとりだす
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) # ベクトル内の位置を返す