Rによるデータ分析

Rによる2進数変換

2進数変換 のRによる実施例です。

2進数変換

質的変数から直接変換する方法もできそうですが、ここでは、まず、 ダミー変換 をします。 ダミー変換したデータから、2進数変換したデータを作ります。

この例では、Cドライブの「Rtest」というフォルダに、 「Data.csv」という名前でデータが入っている事を想定しています。 このコードの前に、ライブラリ「dummies」のインストールが必要です。

データは、質的データと量的データが混ざったものです。 Data.csvという名前です。
dummy

また、DC.csvという名前のファイルも使います。 これを参照して変換するようにしています。
dummy

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

dummy

DataBというのが、変換されたデータです。

DataCは、どのように変換されたのかを示しています。 例えば、1行目のサンプルは、A_DC1が0、A_DC2が0です。 これは、元のデータが、A_A1であることがDataCからわかります。

アルゴリズム

ダミー変換をすると、行ごとに1が入っている変数が1つあります。 この性質を使っています。 まず、ダミー変換をして、3列目に1が入るのなら、変換表の3行目が、2進数変換の結果として使います。

このアルゴリズムの欠点

変換表を事前に準備する必要があります。 また、この例の場合は、32個よりもカテゴリが多い場合は対応できません。

cleandataのencode_binary

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



Tweet データサイエンス教室