2進数変換 のRによる実施例です。
質的変数から直接変換する方法もできそうですが、ここでは、まず、 ダミー変換 をします。 ダミー変換したデータから、2進数変換したデータを作ります。
この例では、Cドライブの「Rtest」というフォルダに、 「Data.csv」という名前でデータが入っている事を想定しています。 このコードの前に、ライブラリ「dummies」のインストールが必要です。
データは、質的データと量的データが混ざったものです。
Data.csvという名前です。
また、DC.csvという名前のファイルも使います。
これを参照して変換するようにしています。
setwd("C:/Rtest") # 作業用ディレクトリを変更
library(fastDummies)# ライブラリを読み込み
library(dplyr)# ライブラリを読み込み
Data <- read.csv("Data.csv", header=T) # 変換対象のデータを読み込み
DC <- read.csv("DC.csv", header=T) # 2進数データを読み込み
Data1 <- Data
for (i in 1:ncol(Data1)) {
if (class(Data[,i]) == "character") {
Data2 <- as.data.frame(Data[,i])
colnames(Data2) <- colnames(Data[i])
DataA <- dummy_cols(Data2,remove_first_dummy = FALSE,remove_selected_columns = TRUE)# ダミー変換
DataName <- colnames(DataA)
DataName2 <- as.data.frame(DataName)
colnames(DataName2) <- colnames(Data[i])
DataA2 <- DC[1,] # 初期化
colnames(DataA2) <- paste(colnames(Data2),sep="_",colnames(DataA2))
for (i2 in 1:nrow(DataA)) {
for (i3 in 1:ncol(DataA)) {
if (DataA[i2,i3] == 1) {
DataA2[i2,] <- DC[i3,]
}
}
}
if (i == 1) {
DataC <- DataName2
} else {
#DataC <- cbind(DataC,DataName2)
DataC$Index <- rownames(DataC)
DataName2$Index <- rownames(DataName2)
DataC <- full_join(DataC,DataName2)
}
} else {
DataA2 <- as.data.frame(Data[,i])
colnames(DataA2) <- colnames(Data[i])
}
if (i == 1) {
DataB <- DataA2
} else {
DataB <- cbind(DataB,DataA2)
}
}
for (i4 in ncol(DataB):1) {
if (var(DataB[,i4]) == 0) {
DataB[,i4] <- NULL# 同じ値だけの変数は、削除
}
}
DC$Index <- rownames(DC)
DataC$Index <- rownames(DataC)
DataC <- inner_join(DataC,DC)
DataC$Index <- NULL
DataB
DataC
DataBというのが、変換されたデータです。
DataCは、どのように変換されたのかを示しています。 例えば、1行目のサンプルは、A_DC1が0、A_DC2が0です。 これは、元のデータが、A_A1であることがDataCからわかります。
ダミー変換をすると、行ごとに1が入っている変数が1つあります。 この性質を使っています。 まず、ダミー変換をして、3列目に1が入るのなら、変換表の3行目が、2進数変換の結果として使います。
変換表を事前に準備する必要があります。 また、この例の場合は、32個よりもカテゴリが多い場合は対応できません。
cleandataというパッケージのencode_binaryという関数は、2進数変換ができるものとして作られています。
これを使えれば、上記のような長いコードが不要で、数行で済むのですが、
「levels<-.factor`(`*tmp*`, value = c(0, 1)) でエラー: 水準の数が異なります 」
というエラーが出て、筆者は使えないでいます。
カテゴリが2個の時はできるのですが、3個だとエラーになります。
ちなみに、この関数は、質的変数がcharacterになっていたら、factorに変更しておく必要があります。 factorなので、「水準」という言い方でエラーが出ています。
CRAN
cleandataのマニュアルです、
https://cran.r-project.org/web/packages/cleandata/cleandata.pdf