class.ind в data.table в r

#r #data.table

#r #data.table

Вопрос:

Возьмите эту игрушку data.table :

 dt <- data.table(a=1:3,k=letters[2:4],e=4:6)

   a k e
1: 1 b 4
2: 2 c 5
3: 3 d 6
  

Я хочу преобразовать переменную «k» в фиктивную (k)

Я могу сделать так,

 dt[,class.ind(k)]
cbind(dt[,1,with=FALSE],dt[,class.ind(k)],dt[,3,with=FALSE])
  

в результате:

    a b c d e
1: 1 1 0 0 4
2: 2 0 1 0 5
3: 3 0 0 1 6
  

Я думаю, что должен быть более простой способ.

Ответ №1:

Использовать dcast.data.table . Вам нужна переменная или функция, которая будет возвращать 1/0, указывая, присутствует ли комбинация.

  library(reshape2)
# using a variable)
k_ind <-  dcast.data.table(dt[,.N,by=names(dt)], a e~k,fill=0L)
k_ind
#    a e b c d
# 1: 1 4 1 0 0
# 2: 2 5 0 1 0
# 3: 3 6 0 0 1

# using a function
k_ind2 <-  dcast.data.table(a e ~ k, data=dt, fun=function(x) any(length(x)) 0L)



# you can change the column order using setcolorder


setcolorder(k_ind, c('a',unique(dt[['k']]),'e'))
k_ind
#    a b c d e
# 1: 1 1 0 0 4
# 2: 2 0 1 0 5
# 3: 3 0 0 1 6
  

Комментарии:

1. Как раз собирался опубликовать model.matrix ответ, но это приятнее.

2. я не понимаю, как работать с «any (x) 0L», можете ли вы мне объяснить.