Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在运行时考虑未知级别,同时在设计时为已知级别设置标签_R_R Factor - Fatal编程技术网

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

R 在运行时考虑未知级别,同时在设计时为已知级别设置标签,r,r-factor,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 } 输出将是: # [1] Data 1 Data 2 Data 3 D

考虑一个简单的函数,该函数使用无序级别对向量进行因子化和标记:

  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
  }
输出将是:

# [1] Data 1 Data 2 Data 3 Data 1 <NA>  
# Levels: Data 1 Data 2 Data 3
有没有一种方法可以在设计时为已知级别设置标签,同时仍然包括可能在运行时传递给代码的新的未知级别?

您可以这样做

  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
  }
你可以

  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
  }
在%中使用%是一种方法

 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
在%中使用%是一种方法

 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
您可以使用包中的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"))
您可以使用包中的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"))

结果级别的顺序重要吗?@DavidRobinson级别是无序的,我应该指定并编辑该问题。感谢你简洁明了的解决方案。结果等级的顺序重要吗?@DavidRobinson等级是无序的,我应该指定并编辑这个问题。感谢您简洁明了的解决方案。