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 является номинальной (категориальной) переменной, тогда какая разница для моих данных?

спасибо

3 ответов


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

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

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

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

его полезно использовать 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

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

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

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

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

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

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

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

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

когда создается факторная переменная, она просматривает все заданные значения и создает "уровни"... взгляните на:

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

затем вместо хранения строк символов "дебет ""кредит ""неправильно написанный debbit" и т. д... он просто хранит целое число вместе с уровнями... взгляните на:

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

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

если вы неправильно наберете "debbit" и добавите его в список, а затем выполните уровни(type.f) вы увидите его как новый уровень... в противном случае вы можете сделать table(type.с.)

когда есть только три элемента в списке, это не имеет большого значения для Тома хранения, но по мере того, как ваш список становится длиннее, "кредит" (6 символов) и "дебет" (5 символов) начнут занимать гораздо больше места, чем 4 байта, необходимые для хранения целого числа (плюс пара байтов). Небольшой эксперимент показывает, что для случайно выбранного набора тип.c, порог на объекте.размер(тип.с-объекты.размер(тип.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, как я думал поможет с ясностью.


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