Мне нужно создать несколько необычных фиктивных переменных, и у меня возникли проблемы. По сути, в моем наборе данных каждый учитель может вести несколько классов. Я создаю многоуровневый набор данных, поэтому это нормально, что есть повторяющиеся идентификаторы учителей.
Вот пример данных:
#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)
Как вы можете видеть, учителя с идентификаторами 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
Я догадываюсь, что мне нужно перебрать идентификаторы, чтобы создать их, но после этого я действительно не вижу возможности достичь того, чего я хочу.
data.frame(cbind(x,y))
, поскольку cbind предоставит вам матрицу символов - person Frank   schedule 25.05.2016for (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)
после обычного кода, но это довольно долго. - person Frank   schedule 25.05.2016character
dat$class
, а результат к логическому, а затем к числовому. Напримерas.logical(ave(as.character(dat$class.taught),dat$teacher.id,FUN=function(x) "ELA" %in% x))
. - person nicola   schedule 25.05.2016