首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:因子的使用

R:因子的使用
EN

Stack Overflow用户
提问于 2011-12-28 14:35:27
回答 3查看 28.8K关注 0票数 16

我有一些数据:

代码语言:javascript
复制
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

如果我输入以下命令:

代码语言:javascript
复制
type <- factor(type) 

其中type是名义(分类)变量,那么它对我的数据有什么影响?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-29 10:49:42

进行统计时,因子与字符向量:在进行统计时,R处理因子和字符向量的方式没有区别。事实上,将因子变量保留为字符向量通常更容易。

如果使用字符向量作为分类变量,使用lm()进行回归或方差分析,则会得到正常模型输出,但会显示以下消息:

代码语言:javascript
复制
Warning message:
In model.matrix.default(mt, mf, contrasts) :
  variable 'character_x' converted to a factor

操纵数据帧时的因子与字符矢量:操纵数据帧时,字符矢量和因子的处理方式截然不同。有关R&因子的烦恼的一些信息可以在量子森林博客R pitfall #3: friggin’ factors上找到。

在使用read.tableread.csv从.csv或.txt读取数据时,使用stringsAsFactors = FALSE非常有用。正如在另一个回复中提到的,你必须确保字符向量中的所有内容都是一致的,否则每个打字错误都将被指定为不同的因素。您可以使用函数gsub()来修复拼写错误。

这是一个很好的例子,展示了lm()如何通过一个字符向量和一个因子给出相同的结果。

一个随机的自变量:

代码语言:javascript
复制
continuous_x <- rnorm(10,10,3)

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

代码语言:javascript
复制
character_x  <- (rep(c("dog","cat"),5))

将字符向量转换为因子变量。factor_x <- as.factor(character_x)

为这两个类别提供随机值:

代码语言:javascript
复制
character_x_value <- ifelse(character_x == "dog", 5*rnorm(1,0,1), rnorm(1,0,2))

在自变量和因变量之间创建随机关系

代码语言:javascript
复制
continuous_y <- continuous_x*10*rnorm(1,0) + character_x_value

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

代码语言:javascript
复制
summary(lm(continuous_y ~ continuous_x + factor_x))
summary(lm(continuous_y ~ continuous_x + character_x))
票数 17
EN

Stack Overflow用户

发布于 2011-12-28 20:16:33

这完全取决于您对数据提出的问题!

代码语言:javascript
复制
type.c <- c("debit", "debit", "credit")
type.f <- factor(type.c)

这里,type.c只是一个字符串列表,而type.f是一个因子列表(这是正确的吗?或者它是一个数组?)

代码语言:javascript
复制
storage.mode(type.c)
# [1] "character"
storage.mode(type.f)
# [1] "integer"

当创建一个因子变量时,它会查看所有已给出的值,并创建“级别”...看一眼:

代码语言:javascript
复制
 levels(type.f)
 # [1] "credit" "debit"

然后,代替存储字符串"debit“、"credit”、"mis-spelt debbit“等...它只存储整数和级别...看一看:

代码语言:javascript
复制
str(type.f)
# Factor w/ 2 levels "credit","debit": 2 2 1

也就是说,在type.c中,它表示c("debit","debit",",credit"),级别(type.f)表示"credit“"debit",您可以看到str(type.f)开始列出存储时的前几个值,即2 2 1...

如果你错误地输入了"debbit“并将其添加到列表中,然后执行一个级别(type.f),您将看到它是一个新的级别……否则,您可以使用table(type.c)。

当列表中只有三个元素时,这对存储量没有太大影响,但随着列表变长,"credit“(6个字符)和"debit”(5个字符)将占用比4个字节(加上几个字节)更多的存储空间。一个小实验表明,对于随机选择的一组type.c,object.size(type.c)>object.size(type.f)的阈值大约是96个元素。

代码语言:javascript
复制
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‘。

票数 12
EN

Stack Overflow用户

发布于 2011-12-28 19:18:31

类型将从字符转换为因子。主要的区别是因素有预先定义的水平。因此,它们的值只能是这些级别中的一个或NA。而字符可以是任何东西。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8652694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档