忍者ブログ
1

×

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

因子変数と数値変数が混在しているデータフレームで、因子だけのと数値だけのデータフレームに分ける
# データの準備
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
PR
library(psych)
data(bfi) # psychパッケージ内のデータセット
dat <- bfi

# 各変数ごとに反応の種類を調べる
sapply(dat, function(x) levels(factor(x)))
  # 変数ごとに反応や単位が違う場合に使う。データはデータフレームにしておくこと
  # library(psych); data(sat.act); sapply(sat.act, function(x) levels(factor(x)))
# 全体の回答数
summary(factor(as.matrix(dat)))
# 一応プロットもしてみる
win.graph()
plot(as.vector(as.matrix(dat)))
win.graph()
hist(as.vector(as.matrix(dat)))

# 各項目ごとの反応数を集計する。
# 有効回答 (NA, Inf, NaN以外の反応) 種類をとりだす
(res <- names(table(as.matrix(dat)))) # table関数はNAとかは集計しないことを利用
resN <- length(res) # 反応の種類数
itemN <- ncol(dat) # 項目数
count.dat <- data.frame(matrix(NA, itemN, resN)) # 集計表用の行列。行が項目、列が反応
  rownames(count.dat) <- names(dat)
  colnames(count.dat) <- res
for (i in 1:resN){
count.dat[,i] <- sapply(dat, function(x) sum(na.omit(x)==res[i]))
}
count.dat

# NA, NaN, Infも調べる
na <- sapply(dat, function(x) sum(is.na(x))) # NAとNaNがカウントされる
inf <- sapply(dat, function(x) sum(is.infinite(x))) # Infをカウント

# 記述統計とかとくっつける。記述統計はpsychパッケージのdescribe関数で
descriptives <- cbind(data.frame(describe(dat)), count.dat, na, inf)
descriptives
# csvで保存
write.csv(descriptives, file="descriptives.csv", quote=FALSE)

データフレームの列ごとに数値をカウントする。
Excelでいうとcountifみたいなものか

dat <- data.frame(matrix(sample(1:5, 2000, replace=T), 200, 10)) # 10項目5件法の尺度に200人が答えた、という仮想データ
count.dat <- matrix(NA, 5, 10) # 集計表用の行列
for (i in 1:5){
count.dat[i,] <- sapply(dat, function(x) sum(x==i))
}
colnames(count.dat) <- colnames(dat)
rownames(count.dat) <- 1:5
count.dat # 集計表の表示
rowSums(count.dat) # 回答ごとの集計
colSums(count.dat) # 項目ごとの全反応数




# テスト用データフレーム。組み込みデータセットから
dat.arq <- airquality
dat.iris <- iris
dat.atn <- attenu
dat.or <- Orange # classが複数あるデータフレーム

# 作業スペース内のオブジェクトをclassつきでリストにする
objlist <- sapply(ls(), function(x) class(get(x)))## classが各1つずつのときはベクトル、複数もつものがあるときはリストで格納
objlist
# データフレームのオブジェクトだけ名前をとりだす
dfobjname <- names(objlist)[c(grep("data.frame", objlist))]
dfobjname
# データフレームのオブジェクトだけまとめる
dflist <- list()
for(i in 1:length(dfobjname)) {
  dflist[[i]] <- get(dfobjname[i])
}
names(dflist) <- dfobjname # リストの要素名をデータフレーム名にする
dflist

複数の質問紙を実施して、全部のデータをまとめるときに便利
青木先生の本にも、Rjiwikiにもあったが、昨日知った
知らないことが多いものだ

dat1 <- data.frame(id=c("id001", "id005", "id006", "id007", "id009"), item1=c(1,1,5,4,3), item2=c(2,3,1,5,2), item3=c(2,1,2,4,4))
dat1
dat2 <- data.frame(id=c("id001", "id002", "id003", "id007"), nitem1=c(3,3,3,3), nitem2=c(2,2,NA,2), nitem3=c(1,1,1,4))
dat2

# dat1とdat2を結合する
dat3 <- merge(dat1, dat2, all=T)
dat3
# 一致させる変数名 (id) をそろえておく。各データフレームの項目の変数名は違うものにしておく。all=Tとしておかないと、同じidのものしか抽出しない
dat3.1 <- merge(dat1, dat2)


プロフィール
HN:
tao
HP:
性別:
非公開
職業:
会社員
趣味:
アウトドア、自転車、ジョギング、英語学習
自己紹介:
・千葉在住のサラリーマンです。データ分析っぽいことが仕事。
・今年英検1級取得。今はTOEIC高得点を目指して勉強中。
・興味のあることは野球、アウトドア、英語学習、統計、プログラミング、PC関係などなど。
ブログ内検索
freead
順位表
プロ野球データFreak
セリーグ順位表
パリーグ順位表