在设计时为已知级别设置标签时,在运行时考虑未知级别

时间:2015-04-16 15:11:29

标签: r r-factor

考虑一个简单的函数,用于对向量进行因子分解和标记(具有无序级别):

  my.factor <- function(data){
    levels = c("d1", "d2", "d3")
    labels = c("Data 1", "Data 2", "Data 3")
    factored.data = factor(data, levels, labels)
    factored.data
  }

这适用于已知级别。但是假设将来会添加一个未知级别,我们运行我们的功能:

data = c("d1", "d2", "d3", "d1", "d100")
my.factor(data)

输出将是:

# [1] Data 1 Data 2 Data 3 Data 1 <NA>  
# Levels: Data 1 Data 2 Data 3

但是,我希望将新的未知值作为一个级别包含在内。也就是说,我希望输出类似于:

# [1] Data 1 Data 2 Data 3 Data 1 d100
# Levels: Data 1 Data 2 Data 3 d100

有没有办法在设计时为已知级别设置标签,同时还包括可能在运行时传递给我的代码的新的未知级别?

3 个答案:

答案 0 :(得分:3)

您可以使用plyr包中的mapvalues,该包重新分配指定的因子级别,同时保留其他因素:

my.factor <- function(data){
    levels = c("d1", "d2", "d3")
    labels = c("Data 1", "Data 2", "Data 3")
    plyr::mapvalues(factor(data), levels, labels)
}

my.factor(c("d1", "d2", "d3", "d100"))

答案 1 :(得分:2)

你可以做到

  my.factor <- function(data){
    levels <- c("d1", "d2", "d3")
    labels <- c("Data 1", "Data 2", "Data 3")
    nlevels <- setdiff(unique(data), levels)
    levels<-c(levels, nlevels)
    labels <-c(labels, nlevels)
    factored.data = factor(data, levels, labels)
    factored.data
  }

给出了

data = c("d1", "d2", "d3", "d1", "d100")
my.factor(data)
# [1] Data 1 Data 2 Data 3 Data 1 d100  
# Levels: Data 1 Data 2 Data 3 d100

答案 2 :(得分:0)

使用%in%是一种方式......

 my.factor <- function(data){
    levels = c("d1", "d2", "d3")
    labels = c("Data 1", "Data 2", "Data 3")
    extra <- data[!(data %in% levels)]
    if(length(extra) > 0){
    levels = c("d1", "d2", "d3", extra)
    labels = c("Data 1", "Data 2", "Data 3", extra)
    }
    factored.data = factor(data, levels, labels)
    factored.data
  }

data <- c("d1", "d2", "d3","d100")
my.factor(data)
#[1] Data 1 Data 2 Data 3 d100  
#Levels: Data 1 Data 2 Data 3 d100

data <- c("d1", "d2", "d3", "d1", "d100")
my.factor(data)
#[1] Data 1 Data 2 Data 3 Data 1 d100  
#Levels: Data 1 Data 2 Data 3 d100