如何识别R中数据框中的变量类型?

时间:2016-09-25 15:34:43

标签: r dataframe imputation

我正在尝试使用几种不同的方法为我的团队创建一个全面的自动代码,以实现缺失价值。我知道逻辑,但我在数据类识别方面遇到了麻烦,这对决定选择哪种方法进行估算非常重要。

正在处理的数据如下所示: enter image description here

现在,我希望我的代码能够将变量类型识别为:

  1. 具有多个级别的分类/因子
  2. 具有两个级别1和0(二进制)的因子
  3. 除了1和0之外的两个级别的因子,如'是'和'否'
  4. 连续
  5. 这是我所拥有的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())
    }
    

    我正在尝试改进我用来使其成为通用的逻辑,以便其他人可以使用它但我在这里碰壁了。感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这可以通过检查级别数和级别本身来完成。如果给定data.frame,则categorize是调用categorize.data.frame的通用名称。它反过来为每列调用categorize.defaultcategorize也可以直接在列上调用。

它的工作方式是计算级别数,除非有三个或更多级别使用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"))
相关问题