R изменить категориальные данные на фиктивные переменные

У меня есть многовариантный фрейм данных и я хочу преобразовать категориальные данные внутри в фиктивные переменные, я использовал model.matrix, но это не совсем работает. Пожалуйста, обратитесь к примеру ниже:

age = c(1:15)                                                          #numeric
sex = c(rep(0,7),rep(1,8)); sex = as.factor(sex)                       #factor
bloodtype = c(rep('A',2),rep('B',8),rep('O',1),rep('AB',4));bloodtype = as.factor(bloodtype)         #factor
bodyweight = c(11:25)                                                  #numeric

wholedata = data.frame(cbind(age,sex,bloodtype,bodyweight))

model.matrix(~.,data=wholedata)[,-1]

Причина, по которой я не использовал model.matrix(~age+sex+bloodtype+bodyweight)[,-1], заключается в том, что это всего лишь игрушечный пример. В реальных данных я мог бы иметь еще десятки или сотни столбцов. Я не думаю, что вводить здесь все имена переменных — хорошая идея.

Спасибо


person lolibility    schedule 20.08.2014    source источник
comment
Если вы хотите показать каждый уровень (включая эталонный) в вашей фиктивной матрице, вы можете использовать model.matrix(~ -1 + . , data=wholedata, contrasts.arg = lapply(wholedata[sapply(wholedata, is.factor)], contrasts, contrasts=FALSE))   -  person user20650    schedule 20.08.2014


Ответы (1)


Это cbind все портит. Он преобразует ваши коэффициенты в числовые значения, которые затем неправильно интерпретируются model.matrix.

Если вы просто сделаете wholedata = data.frame(age,sex,bloodtype,bodyweight), проблем не должно быть.

cbind возвращает матрицу, а в матрице все должно быть одного типа. Результатом в этом примере является то, что факторы преобразуются в целые числа (что в первую очередь является базовым представлением фактора), а затем тип матрицы становится целочисленным.

Пытаться

wholedata = cbind(age,sex,bloodtype,bodyweight)
is.integer(wholedata) ## TRUE
is.factor(wholedata[,2]) ## FALSE

wholedata = data.frame(age,sex,bloodtype,bodyweight)
is.integer(wholedata) ## FALSE
is.factor(wholedata[,2]) ## TRUE
person jld    schedule 20.08.2014