-2

いくつかの異なる方法を使用して、欠落値代入のためのチーム向けの包括的な自動化コードを作成しようとしています。ロジックは知っていますが、代入に選択する方法を決定する際に重要なデータクラスの識別に問題があります。

作業中のデータは次のようになります。 ここに画像の説明を入力

ここで、コードで変数の型を次のように識別します。

  1. 複数のレベルを持つカテゴリ/因子
  2. 1 と 0 の 2 つの水準を持つ因数分解 (バイナリ)
  3. 「はい」と「いいえ」のように、1 と 0 を除く 2 つのレベルで因数分解します。
  4. 連続

これが私が持っているWIPコードですが、うまく機能していません。データが異なるとロジックが失敗することを理解しています

data_type_vector<-function(x)
{
  categorical_index<-character()
  binary_index<-character()
  continuous_index<-character()
  binary_index_1<-character()

  data<-x

  for(a in 1:ncol(data)){

if(length(unique(data[,a])) >= 2 & length(unique(data[,a])) < 15 & 
   max(as.character(data[,a]),na.rm=T) != 1 & min(as.character(data[,a]),na.rm=T) !=0)
{

  categorical_index<-c(categorical_index,colnames(data[a]))

} else if (max(as.character(data[,a]),na.rm=T) == 1 & min(as.character(data[,a],na.rm=T))==0) {

  binary_index<-c(binary_index,colnames(data[a]))

} else if (length(unique(data[,a]))==2) {

  #this basically defines categorical variables with two categories like male/female
  #which don't have 1 0 values in the data but are still binary
  #we are keeping them seperate for the purpose of further analysis

  binary_index_1<-c(binary_index_1,colnames(data[a]))

} else

{
  continuous_index<-c(continuous_index,colnames(data[a]))
}

}

assign("categorical_index",categorical_index,envir=globalenv())
assign("binary_index",binary_index,envir=globalenv())
assign("continuous_index",continuous_index,envir=globalenv())
assign("binary_index_1",binary_index_1,envir=globalenv())
}

他の人が使用できるように、汎用にするために使用したロジックを改善しようとしていますが、ここで壁にぶつかっています。どんな助けにも感謝します。

4

1 に答える 1

0

これは、レベル数とレベル自体を確認することで実行できます。 data.frame が指定された場合categorizeに呼び出すジェネリックです。次に、列ごとcategorize.data.frameに呼び出します。列で直接呼び出すこともできます。categorize.defaultcategorize

それが機能する方法は、レベルが 3 つ以上ある場合を除き、レベルの数を計算することです。3 を使用し、レベルが「0」と「1」の場合は 2 を加算します。これにより、0 から 4 までの数値が得られます。次に、意味のあるレベル名を持つ因子を設定します。

要因ではないものはすべて「連続」として識別されることに注意してください。たとえば、質問で示唆されているように、0 と 1 だけを含む列は因子ではないため連続です。

categorize <- function(x, ...) UseMethod("categorize")

categorize.data.frame <- function(x, ...) sapply(x, categorize)

categorize.default <- function(x, ...) {
   factor(min(nlevels(x), 3) + 2*identical(levels(x), c("0", "1")), levels = 0:4, 
    labels = c("continuous", "factor1", "factor2", "factor", "zero-one"))
}

今すぐテストしてください:

DF <- data.frame(a = factor(c(0, 1, 0)), b = factor(c("male", "female", "male")), 
         c = factor(1:3), d = 1:3)

categorize(DF)
##          a          b          c          d 
##   zero-one    factor2     factor continuous 
## Levels: continuous factor1 factor2 factor zero-one

categorize(DF$a)
## [1] zero-one
## Levels: continuous factor1 factor2 factor zero-one

categorize(0:1)
## [1] continuous
## Levels: continuous factor1 factor2 factor zero-one

注:求められているのはレベル数を求めるだけに近いため、代わりにレベル数を返し、-2 を使用して "0"、"1" レベルのバイナリ係数を意味することもできます。あれは、

categorize.default <- function(x, ...) nlevels(x) - 4 * identical(levels(x), c("0", "1"))
于 2016-09-25T17:02:06.110 に答える