我有一个变量是一个因素:
$ year : Factor w/ 8 levels "2003","2004",..: 4 6 4 2 4 1 3 3 7 2 ...
我想创建8个虚拟变量,名为“2003”,“2004”等取值为0或1,具体取决于变量“year”的值。我能想出的最近的是
dt1 <- cbind (dt1, model.matrix(~dt1$year - 1) )
但这会产生不幸的后果
model.matrix
完全省略了NA行(因此,当year
变量中存在NA时,由于长度不同,上述命令失败。当然,我可以用更多的代码解决这些问题,但我喜欢我的代码尽可能简洁(在合理范围内),所以如果有人能提出更好的方法来制作虚拟变量,我将不得不承担。
答案 0 :(得分:2)
您可以使用不会遗漏ifelse()
行的na
(但我想您可能不会将其视为“尽可能简洁”):
dt1 <- data.frame(year=factor(rep(2003:2010, 10))) # example data
dt1 <- within(dt1, yr2003<-ifelse(year=="2003", 1, 0))
dt1 <- within(dt1, yr2004<-ifelse(year=="2004", 1, 0))
dt1 <- within(dt1, yr2005<-ifelse(year=="2005", 1, 0))
# ...
head(dt1)
# year yr2003 yr2004 yr2005
# 1 2003 1 0 0
# 2 2004 0 1 0
# 3 2005 0 0 1
# 4 2006 0 0 0
# 5 2007 0 0 0
# 6 2008 0 0 0
答案 1 :(得分:2)
这是我能得到的简洁。 na.action
选项处理NA
值(我宁愿使用参数而不是全局选项设置,但我看不清楚如何)。列的命名是非常硬编码的,在model.matrix
内没有任何方法可以覆盖它...
options(na.action=na.pass)
dt1 <- data.frame(year=factor(c(NA,2003:2005)))
dt2 <- setNames(cbind(dt1,model.matrix(~year-1,data=dt1)),
c("year",levels(dt1$year)))
如上所述,在某些情况下,如果列名不是合法的R变量名,则可能会遇到麻烦。
year 2003 2004 2005
1 <NA> NA NA NA
2 2003 1 0 0
3 2004 0 1 0
4 2005 0 0 1
答案 2 :(得分:1)
library(caret)
提供了一个非常简单的函数(dummyVars
)来创建虚拟变量,尤其是当您有多个因子变量时。但是你必须确保目标变量是因子。例如如果您的Sales$year
是数字,则必须将其转换为系数:as.factor(Sales$year)
假设我们有原始数据集'Sales',如下所示:
year Sales Region
1 2010 3695.543 North
2 2010 9873.037 West
3 2008 3579.458 West
4 2005 2788.857 North
5 2005 2952.183 North
6 2008 7255.337 West
7 2005 5237.081 West
8 2010 8987.096 North
9 2008 5545.343 North
10 2008 1809.446 West
现在我们可以同时创建两个虚拟变量:
>library(lattice)
>library(ggplot2)
>library(caret)
>Salesdummy <- dummyVars(~., data = Sales, levelsOnly = TRUE)
>Sdummy <- predict(Salesdummy, Sales)
结果将是:
2005 2008 2010 Sales RegionNorth RegionWest
1 0 0 1 3695.543 1 0
2 0 0 1 9873.037 0 1
3 0 1 0 3579.458 0 1
4 1 0 0 2788.857 1 0
5 1 0 0 2952.183 1 0
6 0 1 0 7255.337 0 1
7 1 0 0 5237.081 0 1
8 0 0 1 8987.096 1 0
9 0 1 0 5545.343 1 0
10 0 1 0 1809.446 0 1