在运行时考虑未知水平,同时在设计时为已知水平设置标签
Factor unknown levels at runtime while setting labels for known levels at design time
考虑一个分解和标记向量(具有无序级别)的简单函数:
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
有没有一种方法可以在设计时为已知级别设置标签,同时仍然包括可能在 运行 时传递给我的代码的新的未知级别?
你可以
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
使用 %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
您可以使用 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"))
考虑一个分解和标记向量(具有无序级别)的简单函数:
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
有没有一种方法可以在设计时为已知级别设置标签,同时仍然包括可能在 运行 时传递给我的代码的新的未知级别?
你可以
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
使用 %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
您可以使用 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"))