2011-12-28 3 views
11

У меня есть некоторые данные:R: использование фактора

transaction <- c(1,2,3); 
date <- c("2010-01-31","2010-02-28","2010-03-31"); 
type <- c("debit", "debit", "credit"); 
amount <- c(-500, -1000.97, 12500.81); 
oldbalance <- c(5000, 4500, 17000.81) 
evolution <- data.frame(transaction, date, type, amount, oldbalance, row.names=transaction, stringsAsFactors=FALSE); 
evolution$date <- as.Date(evolution$date, "%Y-%m-%d"); 
evolution <- transform(evolution, newbalance = oldbalance + amount); 
evolution 

Если я ввожу команду:

type <- factor(type) 

где type является номинальным (категориальный) переменную, то какая разница, на мой данные?

Спасибо

ответ

10

Факторы против векторных векторов при выполнении статистики: С точки зрения статистики, нет никакой разницы в том, как R обрабатывает факторы и векторы символов. Фактически, его часто легче оставить фактор-переменные в качестве символьных векторов.

Если вы регресс или ANOVA с лм() с вектором символа в качестве категорического переменных вы получите нормальный выход модели, но с сообщением:

Warning message: 
In model.matrix.default(mt, mf, contrasts) : 
    variable 'character_x' converted to a factor 

Факторы против векторов символов при манипулировании dataframes: Однако при манипулировании кадрами данных характерные векторы и факторы обрабатываются по-разному. Некоторую информацию о раздражениях факторов R & можно найти в блоге Quantum Forest, R pitfall #3: friggin’ factors.

Полезно использовать stringsAsFactors = FALSE при чтении данных в формате .csv или .txt с использованием read.table или read.csv. Как отмечено в другом ответе, вы должны убедиться, что все в вашем символьном векторе согласовано, иначе каждая опечатка будет обозначаться как другой фактор. Вы можете использовать функцию gsub() для исправления опечаток.

Вот приведенный пример, показывающий, как lm() дает вам одинаковые результаты с символом вектора и коэффициента.

Случайный независимой переменной:

continuous_x <- rnorm(10,10,3) 

Случайный категориальная переменная в качестве вектора символов:

character_x <- (rep(c("dog","cat"),5)) 

Преобразование вектора символов в переменной фактора. factor_x < - as.factor (character_x)

Дайте две категории случайных величин:

character_x_value <- ifelse(character_x == "dog", 5*rnorm(1,0,1), rnorm(1,0,2)) 

Создать случайную связь между indepdent переменными и зависимой переменной

continuous_y <- continuous_x*10*rnorm(1,0) + character_x_value 

Compare выход линейной модели с факторной переменной и символом . Обратите внимание на предупреждение, которое задается символьным символом.

summary(lm(continuous_y ~ continuous_x + factor_x)) 
summary(lm(continuous_y ~ continuous_x + character_x)) 
+0

«Полезно использовать' strAsAsFactors = TRUE' при чтении данных из .csv или .txt с использованием 'read.table' или' read.csv'. Мне любопытно, почему? Если «часто проще оставить фактор-переменные в качестве символьных векторов», то почему вы хотите сделать обратное при импорте фрейма данных? – landroni

+1

Это должны быть строкиAsFactors = FALSE. Я исправил текст. Спасибо за вопросы. –

4

тип будет преобразован с символа в коэффициент. Основное различие заключается в том, что факторы имеют предопределенные уровни. Таким образом, их значение может быть только одним из этих уровней или NA. В то время как символы могут быть чем угодно.

9

Все зависит от того, на какой вопрос вы запрашиваете данные!

type.c <- c("debit", "debit", "credit") 
type.f <- factor(type.c) 

Здесь type.c это просто список символьных строк, в то время как type.f список факторов (это правильно? Или это массив?)

storage.mode(type.c) 
# [1] "character" 
storage.mode(type.f) 
# [1] "integer" 

когда фактор переменный создаются он просматривает все значения, которые были даны и создают «уровни» ... есть быстрый взгляд на:

levels(type.f) 
# [1] "credit" "debit" 

Тогда вместо того, чтобы хранить строки символов «дебет», «кредит» «неверные -spelt debbit "и т. д. i т просто хранит целое вместе с уровнями ... посмотреть на:

str(type.f) 
# Factor w/ 2 levels "credit","debit": 2 2 1 

т.е. в type.c он говорит с («дебет», «дебет», «кредит») и уровней (типа .f) говорит «кредит» «дебет», вы видите, что str (type.f) начинает перечислять первые несколько значений при их сохранении, т. е. 2 2 1 ...

Если вы неправильно написали «debbit», и добавьте его в список, а затем выполните уровни (type.f), вы увидите его как новый уровень ... иначе вы могли бы сделать таблицу (type.c).

Когда в списке всего три элемента, это не имеет большого значения для объема хранилища, но по мере того, как ваш список будет длиннее, начнется «кредит» (6 символов) и «дебет» (5 символов) занимают гораздо больше памяти, чем 4 байта, которые требуется для хранения целого числа (плюс пара байтов). Небольшой эксперимент показывает, что для случайно выбранного набора типа.c пороговое значение для object.size (type.c)> object.size (type.f) составляет около 96 элементов.

dc <- c("debit", "credit") 
N <- 300 

# lets store the calculations as a matrix 
# col1 = n 
# col2 = sizeof(character) 
# col3 = sizeof(factors) 
res <- matrix(ncol=3, nrow=N) 

for (i in c(1:N)) { 
    type.c <- sample(dc, i, replace=T) 
    type.f <- factor(type.c) 
    res[i, 1] <- i 
    res[i, 2] <- object.size(type.c) 
    res[i, 3] <- object.size(type.f) 
    cat('N=', i, ' object.size(type.c)=',object.size(type.c), ' object.size(type.f)=',object.size(type.f), '\n') 
} 
plot(res[,1], res[,2], col='blue', type='l', xlab='Number of items in type.x', ylab='bytes of storage') 
lines(res[,1], res[,3], col='red') 
mtext('blue for character; red for factor') 

cat('Threshold at:', min(which(res[,2]>res[,3])), '\n') 

Извинения за недостаток R'ness, поскольку я думал, что это поможет с ясностью.

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