1. GoogleFormデータの加工(複数回答)
1-1. 複数回答加工用の関数を準備します
# データの加工(複数回答用関数の準備) ----
F_set_choice <- function(org_ans_list, q_index, student_id, ans_str, mat, mat_else) {
# 複数回答ベクトルを配列にして、回答文字列から配列番号を探して1を立てたマトリックスを返す
# ans_str は、";"区切りの文字列
each_ans_list = unlist(org_ans_list[q_index]) # 複数回答のリストを端からベクトルとして結合して 1 つのベクトルとしてまとめる
#if(is.na(ans_str)){
if(ans_str == ""){
# 空文字列(無選択)の場合はNAをセットする(デフォルトで0が埋まっているため)
mat[student_id, ] = matrix(NA, nrow = 1, ncol = ncol(mat))
}else{
sep = ";" # 複数回答は ;区切り
ans_list = unlist(strsplit(ans_str, sep)) # 複数回答を sep で分割して、ベクトル配列へ変換
# 複数回答の各項目に関して、org_ans_list 中でのインデックスを求める
# 完全一致かつ最初にヒットしたインデックスを取得する
for (i in 1:length(ans_list)) {
ans_index = match(ans_list[i], each_ans_list)
if (is.na(ans_index)) {
# org_ans_list に含まれない場合NAが返るものを、「その他」とみなす
mat_else[student_id, 1] = ans_list[i]
} else {
# org_ans_list に含まれる場合は、該当の配列を1で上書きする
mat[student_id, ans_index] = as.integer(1)
}
}
}
return (list(mat, mat_else))
}
F_MakeMultipleFlagList <- function(org_ans_list, q_index, ans) {
# 複数回答を選択肢分横に展開して、1/0フラグを立てたリストを作成する
# すべての要素が 0 の matrix を作成
sample_num = length(ans[,1]) # サンプル数(行)
each_ans_list = unlist(org_ans_list[q_index])
choice_num = length(each_ans_list)
mat = matrix(as.integer(0), nrow=sample_num, ncol=choice_num) # サンプル数(行) × 選択肢数(列)
# 選択肢に無い場合(その他)は、回答内容の文字列をそのままセットする。サンプル数(行) × 1(列)
#- mat_else = matrix("", nrow=sample_num, ncol=1)
mat_else = matrix(NA, nrow=sample_num, ncol=1)
for (sample_id in 1:sample_num) {
mat_list = F_set_choice(org_ans_list, q_index, sample_id, ans[sample_id,], mat, mat_else)
mat = mat_list[[1]] # 選択肢から1が立ったもの
mat_else = mat_list[[2]] # 「その他」の文字列
}
return (list(mat, mat_else))
}
F_SetMultipleColName <- function(df, colname.org){
# 複数回答分解列に列名をつける(10以上なら2桁にする)
col_digit <- if_else((ncol(df) > 9) , true = 2, false = 1) #カラム数2桁(99)まで対応
for (i in 1:ncol(df)) {
colname.new <- paste(colname.org, "_", formatC(i, width = col_digit, flag = "0"), sep = "") # Q02_1, Q11_01 など
names(df)[i] <- colname.new
}
return(df)
}
1-2. データ加工をします(複数回答)
# データの加工(2:複数回答) ----
# 項目名を加工
dat <- dplyr::rename(dat, "Q02" = "好きな食べ物をいくつでも")
# 選択肢の回答文字列
org_ans_q <- c(
"かつ丼",
"ラーメン",
"鳥から",
"かつ丼・ミニラーメンセット"
)
org_ans_list <- list(org_ans_q)
mat_list = F_MakeMultipleFlagList(org_ans_list, 1, data.frame(dat$Q02))
dfTemp1 <- data.frame(mat_list[[1]]) # マージ用df作成
dfTemp2 <- data.frame(mat_list[[2]]) # マージ用df作成
dfTemp1 <- F_SetMultipleColName(dfTemp1, "Q02")
dat <- cbind(dat, dfTemp1)
names(dfTemp2)[1] <- "Q02_Z" #「その他」の項目名
dat <- cbind(dat, dfTemp2)
1-3. データ加工後
元データ Q02 と、変換後の Q02_1 ~ Q02_4, Q02_Z をご覧ください
