Translate

2022年8月10日水曜日

【R言語】How to break out Multi-Answer responses into separate cells

アンケートの複数回答などで、下図の左端の列のように一つのセルに回答の選択肢が記録されている場合があります。

そのようなデータを、上の図の右6列のように、複数回答の選択肢ごとに「1-0」のデータに変換する処理をする必要があったりします。 

 Pythonで処理しているコードがありましたが、R言語のコードが見つかりませんでした。

 あるサイトのPythonのコードを参考にさせていただき、R言語で処理できるようにしてみました。 

 たどたどしいR言語による翻訳ですが、備忘録として記録しておきます。 

 選択肢ごとに論理値の回答を「1-0」に変換して行列の形にするところをもっと簡単にできるのではないかと思いますが、 何とか無理やり処理しています。 

 ツイッターデータのツイートに含まれるハッシュタグリストの処理にも使えそうなのでR言語のコードにしてみました。

'複数回答' = 'Multiple Answers'
 【R言語による複数回答データの処理】
sample <- c('Japan,China,Korea','China,Korea,America,Germany,France','America,Germany,France','Japan,China,Korea,America','China,America,Germany,France','Germany,France','China,America')​​​​
df_sample <- as.data.frame(sample)
colnames(df_sample) <- '複数回答'
df_sample

answers <- strsplit(df_sample$複数回答, ",")
answers_list <- unlist(answers)
answers_list <- unique(unlist(answers))
answers_list

ma_df <- NULL
  for (i in 1:length(answers)) {
    for (j in 1:length(answers_list)) {
     tempanswer <-  answers_list[j] %in% answers[[i]]
       ma_df <- rbind(ma_df,tempanswer) 
  }
 }
ma_dfdm <- ma_df*1
ma_dfdm

slrnum1 <- length(answers_list)

df_ma <- NULL
for (i in 1:slrnum1) {
tempma <- ma_dfdm[seq(i,nrow(ma_dfdm),slrnum1), ]
df_ma <- cbind(df_ma,tempma)
}

colnames(df_ma) <- answers_list
df_ma

df_macomp <- cbind(df_sample,df_ma) 
df_macomp

rownames(df_macomp) <- NULL
​​df_macomp

############END#################################

【下記は部分的に改良したパターンです:論理値のリストからダミー変数行列を作成する部分をより単純化しています:結果は同じです】
################################################
ma_df <- NULL
  for (i in 1:length(answers)) {
    for (j in 1:length(answers_list)) {
     tempanswer <-  answers_list[j] %in% answers[[i]]
      ma_df <- append(ma_df,list(tempanswer))
        }
  }
storage.mode(ma_df) <- "integer"
mamatrix <-  matrix(ma_df, nrow=length(answers_list), ncol=length(answers))
mamatrixt <- t(mamatrix)
ma_dfdm01 <- as.data.frame(mamatrixt) 
colnames(ma_dfdm01) <- answers_list

df_macomp <- cbind(df_sample,ma_dfdm01) 
df_macomp

-----------------------------------------------------------------------------
【下記のコードで「1」を選択肢の文字列に置き換えることができます。結果は下図のようになります。】
df_matxt <- NULL
qmanamelist <- NULL
for (i in 1:length(answers_list)) {
anstxt <- answers_list[i]
df_matxt0 <- ma_dfdm01[,i]
qmatemp <- df_matxt0 %>% str_replace_all(.,"1",anstxt)
df_matxt <- rbind(df_matxt,qmatemp) 
qmaname <- assign(paste0("q_",i),paste0("qma_",i))
qmanamelist <- rbind(qmanamelist,qmaname) 
}
df_matxtt <- t(df_matxt)
colnames(df_matxtt) <- t(qmanamelist[,1])
df_matxtt
df_macomp1 <- cbind(df_sample,df_matxtt) 
df_macomp1
-----------------------------------------------------------------------