【发布时间】:2016-09-23 14:37:00
【问题描述】:
我需要创建一些非正统的虚拟变量,但遇到了一些麻烦。基本上在我的数据集中,每个老师都可以教授多个课程。我正在构建一个多级数据集,因此可以存在重复的教师 ID。
以下是数据示例:
#generate data
teacher.id <- c(1:5, 1:5)
class.taught <- c("ELA", "Math", "Science", "ELA", "Math", "Science", "Math", "ELA", "ELA", "Math")
# combine into data frame
dat <- data.frame(teacher.id, class.taught)
正如您所见,ID 为 1 和 3 的教师都教授 2 个不同的课程。
创建虚拟变量的传统方法产生:
# example of what I have done so far
dat$teach.ELA <- ifelse(dat$class.taught == "ELA", 1, 0 )
dat$teach.MATH <- ifelse(dat$class.taught == "Math", 1, 0 )
dat$teach.SCIENCE <- ifelse(dat$class.taught == "Science", 1, 0 )
dat
但是,我希望新的虚拟变量如下所示:
desired.ELA <- c(1,0,1,1,0,1,0,1,1,0)
desired.MATH <- c(0,1,0,0,1,0,1,0,0,1)
desired.SCIENCE <- c(1,0,1,0,0,1,0,1,0,0)
dat.2 <- data.frame(dat, desired.ELA, desired.MATH, desired.SCIENCE)
dat.2
我的预感是我需要遍历这些 id 来创建这些,但过去我真的看不到实现我想要的东西的途径。
【问题讨论】:
-
不要
data.frame(cbind(x,y)),因为 cbind 会给你一个字符矩阵 -
“想要的”是否有一些规则。变量集?
-
我怀疑它就像
for (crs in levels(dat$class)) dat[crs] <- ave(dat$class, dat$teacher, FUN = function(x) crs %in% x),但不幸的是ave不合作。您可以在您的“常规”代码之后执行for (col in c("teach.ELA","teach.MATH","teach.SCIENCE")) dat[col] <- ave(dat[col], dat$teacher, FUN = max),但它相当冗长。 -
@Frank 你的方式没问题,只要你强制转换为
characterdat$class并将结果转换为逻辑然后转换为数字。例如as.logical(ave(as.character(dat$class.taught),dat$teacher.id,FUN=function(x) "ELA" %in% x)). -
@nicola 好吧,不过,看起来麻烦多于其价值,嗯。
标签: r dataframe dummy-variable