2015-04-16 3 views
1

Рассмотрим простую функцию, факторы и маркирует вектор (с неупорядоченным уровней):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 

Есть ли способ, чтобы установить метки для известных уровней во время разработки, в то же время в том числе новые, неизвестные уровни, которые могут быть переданы в мой код во время выполнения?

+1

Означает ли порядок полученных уровней? –

+0

@ Уровни DavidRobinson неупорядочены, я должен был указать и отредактировать вопрос. Цените свое четкое, сжатое решение. – user1393477

ответ

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 
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 
3

Вы можете использовать mapvalues из plyr пакета, который переприсваивает определенные уровни фактора, оставляя других нет данных:

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")) 

 Смежные вопросы

  • Нет связанных вопросов^_^