2016-09-25 104 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

    这很有道理,非常感谢你的解决方案。 –