2016-09-25 176 views
-2

我正在嘗試使用幾種不同的方法爲我的團隊創建一個全面的自動化代碼,用於缺少值填補。我知道邏輯,但是我在數據類別識別方面遇到了麻煩,這在確定選擇插補方法時很重要。如何識別R中數據框中的變量類型?

說我長相的工作是這樣的數據: enter image description here

現在,我想我的代碼,以確定的變量類型:多層次

  • 因子

    1. 範疇/因子與二級1和0(二進制)
    2. 因子除了1和0兩個級別,如'是'和'否'
    3. 連續

    這裏是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()) 
    } 
    

    我試圖改善邏輯之我已經習慣使它成爲通用的,以便其他人可以使用它,但我在這裏遇到了一堵牆。感謝任何幫助。

  • +0

    你可以使用'類()'和/或'STR()'和一些簡單的控制流語句 –

    +0

    @哈克-R它不工作,我打算結果的方式。 –

    +0

    圖片不是代碼/數據。他們是爲圖表。 – hrbrmstr

    回答

    0

    這可以通過檢查層數和層次本身來完成。 categorize是通用的,如果給定data.frame,則調用categorize.data.frame。它依次爲每列調用categorize.default。也可以直接在列上調用categorize

    它的工作方式是計算級別的數量,除非有三個或更多的它使用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")) 
    
    +0

    這是一個非常好的解釋,它總是有意義的。因此,如果我使用'categorize.default < - function(x,...)nlevels(x) - 4 * identical(levels(x),c(「0」,「1」))'這些是值含義:_-2:二進制(0和1)_,_ 0:連續_,_ 1:factor1 _,_ 2:factor2 _,_> = 3:具有多個levels_的因子。我對麼? –

    +0

    如果n是評論中公式的值,那麼n = 2意味着2個等級,n = 3意味着3個等級,n = 4個等級等等。使用'min(nlevels(x),3) - 4 * (水平(x),c(「0」,「1」)),如果你想讓3表示3個或更多的水平,但我不確定在這樣的3點切斷它有什麼好處。 –

    +0

    這很有道理,非常感謝你的解決方案。 –