Подтвердить что ты не робот

Создание фиктивных переменных в R data.table

Я работаю с чрезвычайно большим набором данных в R и работаю с кадрами данных и решил переключиться на data.tables, чтобы ускорить работу. У меня возникли проблемы с пониманием операций J, в частности я пытаюсь генерировать фиктивные переменные, но я не могу понять, как кодировать условные операции в data.tables [].

MWE:

test <- data.table("index"=rep(letters[1:10],100),"var1"=rnorm(1000,0,1))

Я хотел бы добавить столбцы a через j как фиктивные переменные, так что столбец a будет иметь значение 1, когда index == "a" и 0 в противном случае. В среде data.frame это выглядит примерно так:

test$a <- 0

test$a[test$index=='a'] <- 1
4b9b3361

Ответ 1

Это похоже на то, что вы ищете:

inds <- unique(test$index)
test[, (inds) := lapply(inds, function(x) index == x)]

который дает

      index        var1     a     b     c     d     e     f     g     h     i     j
   1:     a  0.25331851  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   2:     b -0.02854676 FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   3:     c -0.04287046 FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   4:     d  1.36860228 FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
   5:     e -0.22577099 FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
  ---                                                                              
 996:     f -1.02040059 FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 997:     g -1.31345092 FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 998:     h -0.49448088 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 999:     i  1.75175715 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
1000:     j  0.05576477 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

Здесь другой способ:

dcast(test, index + var1 ~ index, fun = length)
# or, if you want to preserve row order
dcast(test[, r := .I], r + index + var1 ~ index, fun = length)[, r := NULL]

И еще:

rs = split(seq(nrow(test)), test$index)
test[, names(rs) := FALSE ]
for (n in names(rs)) set(test, i = rs[[n]], j = n, v = TRUE )