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

如何识别R中数据帧中的变量类型?,r,dataframe,imputation,R,Dataframe,Imputation,我正在尝试使用几种不同的方法为我的团队创建一个用于缺失值插补的综合自动化代码。我知道逻辑,但我在数据类识别方面有困难,这对于决定选择哪种方法进行插补很重要 我正在处理的数据如下所示: 现在,我希望我的代码将变量类型标识为: 分类/多层次因素 具有两个级别1和0的因子(二进制) 除1和0外,有两个级别的因子,如“是”和“否” 连续的 这是我拥有的WIP代码,但它没有很好地完成工作,而且我知道如果数据不同,逻辑将失败 data_type_vector<-function(x) { cat

我正在尝试使用几种不同的方法为我的团队创建一个用于缺失值插补的综合自动化代码。我知道逻辑,但我在数据类识别方面有困难,这对于决定选择哪种方法进行插补很重要

我正在处理的数据如下所示:

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

  • 分类/多层次因素
  • 具有两个级别1和0的因子(二进制)
  • 除1和0外,有两个级别的因子,如“是”和“否”
  • 连续的
  • 这是我拥有的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())
    }
    

    data\u type\u vector这可以通过检查级别数和级别本身来完成
    categorize
    是在给定data.frame时调用
    categorize.data.frame
    的泛型。它依次调用每个列的
    categorize.default
    <代码>分类
    也可以直接在列上调用

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

    categorize您可以使用
    class()
    和/或
    str()
    和一些简单的控制流statements@Hack-R它不符合我预期的结果。图片不是代码/数据。它们用于图表。请参阅如何将可复制的示例发布到SO.@G.Grothendieck。我会记住这一点,谢谢!这是一个非常好的解释,完全有道理。因此,如果我使用
    categorize.default=3:factor和多个级别。我说的对吗?如果n是你评论中公式的值,那么n=2表示2级,n=3表示3级,n=4级,等等。使用
    min(nlevels(x),3)-4*相同(levels(x),c(“0”,“1”))
    如果您希望3表示3个或更多级别,但我不太确定将其从3中删除是否有任何好处。这是有道理的,非常感谢您的解决方案。
    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
    
    categorize.default <- function(x, ...) nlevels(x) - 4 * identical(levels(x), c("0", "1"))