R:使用因子

时间:2011-12-28 06:35:27

标签: r types

我有一些数据:

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 个答案:

答案 0 :(得分:12)

执行统计时的因素与角色向量: 在统计方面,R如何处理因子和特征向量没有区别。实际上,通常更容易将因子变量留作字符向量。

如果使用lm()进行回归或ANOVA,并将字符向量作为分类 变量你将得到正常的模型输出但是有消息:

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

操纵数据帧时的因素与角色向量: 但是,在操纵数据帧时,角色向量和因子的处理方式会有很大不同。关于R&amp; S的烦恼的一些信息因子可以在量子森林博客R pitfall #3: friggin’ factors上找到。

使用stringsAsFactors = FALSEread.table从.csv或.txt读取数据时,使用read.csv非常有用。如另一个回复中所述,您必须确保角色向量中的所有内容都是一致的,否则每个拼写错误都会被指定为不同的因素。您可以使用函数gsub()来修复拼写错误。

这是一个工作示例,显示lm()如何为您提供相同的结果 一个字符向量和一个因子。

随机自变量:

continuous_x <- rnorm(10,10,3)

随机分类变量作为字符向量:

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

将字符向量转换为因子变量。 factor_x&lt; - 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

将线性模型的输出与因子变量和字符进行比较 向量。请注意使用字符向量给出的警告。

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

答案 1 :(得分: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"

然后,而不是存储字符串“借记”“信用”“拼写错误的debbit”等...它只是存储整数和级别...看看:

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

即。在type.c中它表示c(“借记”,“借记”,“,信用”)和级别(type.f)表示“信用”“借记”,你看到str(type.f)开始列出前几个存储时的值,即2 2 1 ...

如果你错误地键入“debbit”并将其添加到列表中,然后再执行一个级别(type.f),你会将它看作一个新级别...否则你可以做表格(type.c )。

当列表中只有三个元素时,它对存储卷没有太大影响,但随着列表变长,“信用”(6个字符)和“借记”(5个字符)将开始占用比保存整数(加上几个字节)所需的4个字节多得多的存储空间。一个小实验表明,对于一组随机选择的type.c,object.size(type.c)&gt; 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'的道歉,因为我认为它有助于清晰。

答案 2 :(得分:4)

类型将从字符转换为因子。主要区别在于因素具有预定义的水平。因此,它们的价值只能是那些水平之一或NA。而角色可以是任何东西。