R:系数的使用

R:系数的使用,r,types,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(transact

我有一些数据:

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

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

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

type.c <- c("debit", "debit", "credit")
type.f <- factor(type.c)
创建因子变量时,它会查看所有给定的值,并创建“级别”。。。浏览一下:

 levels(type.f)
 # [1] "credit" "debit"
然后,代替存储字符串“借方”“贷方”“拼写错误的debbit”等。。。它只存储整数和级别。。。看看:

str(type.f)
# Factor w/ 2 levels "credit","debit": 2 2 1
i、 e.在type.c中,它表示c(“借方”,“借方”,“贷方”),级别(type.f)表示“贷方”“借方”,您可以看到str(type.f)开始列出存储的前几个值,即2 1

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

当列表中只有三个元素时,对存储量没有多大影响,但随着列表变长,“贷记”(6个字符)和“借记”(5个字符)将开始占用比保存整数所需的4个字节(加上两个字节)多得多的存储空间。一个小的实验表明,对于一组随机选择的type.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')

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

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

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

操作数据帧时的因子与字符向量: 但是,在处理数据帧时,字符向量和因子的处理方式非常不同。关于R&factors烦恼的一些信息可以在Quantum Forest博客上找到


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

下面是一个工作示例,演示了lm()如何使用 一个字符向量和一个因子

随机自变量:

continuous_x <- rnorm(10,10,3)

“当使用
read.table
read.csv
从.csv或.txt读取数据时,使用
stringsAsFactors=TRUE
非常有用”我很好奇为什么?如果“通常更容易将因子变量保留为字符向量”,那么在导入数据帧时为什么要执行相反的操作?它应该是stringsAsFactors=FALSE。我把课文修好了。谢谢你的提问。相同的静态结果和相同的警告信息。
Warning message:
In model.matrix.default(mt, mf, contrasts) :
  variable 'character_x' converted to a factor
continuous_x <- rnorm(10,10,3)
character_x  <- (rep(c("dog","cat"),5))
character_x_value <- ifelse(character_x == "dog", 5*rnorm(1,0,1), rnorm(1,0,2))
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))