data.table
objetos agora têm um operador: =. O que torna este operador diferente de todos os outros operadores de atribuição? Além disso, quais são seus usos, quão mais rápido é e quando deve ser evitado?
fonte
data.table
objetos agora têm um operador: =. O que torna este operador diferente de todos os outros operadores de atribuição? Além disso, quais são seus usos, quão mais rápido é e quando deve ser evitado?
Aqui está um exemplo mostrando 10 minutos reduzidos para 1 segundo (de NEWS na página inicial ). É como subatribuir a um, data.frame
mas não copia a tabela inteira todas as vezes.
m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
system.time(for (i in 1:1000) DF[i,1] <- i)
user system elapsed
287.062 302.627 591.984
system.time(for (i in 1:1000) DT[i,V1:=i])
user system elapsed
1.148 0.000 1.158 ( 511 times faster )
Colocar o :=
em j
como isso permite que mais idiomas:
DT["a",done:=TRUE] # binary search for group 'a' and set a flag
DT[,newcol:=42] # add a new column by reference (no copy of existing data)
DT[,col:=NULL] # remove a column by reference
e:
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
Não consigo pensar em nenhuma razão para evitar :=
! Além de, dentro de um for
loop. Como :=
aparece dentro DT[...]
, vem com a pequena sobrecarga do [.data.table
método; por exemplo, S3 expedição e a verificação da presença e tipo de argumentos, tais como i
, by
, nomatch
etc. Assim, para dentro de for
laçadas, há uma sobrecarga baixo, versão directa de :=
chamada set
. Veja ?set
para mais detalhes e exemplos. As desvantagens de set
incluir i
devem ser números de linha (sem pesquisa binária) e você não pode combiná-lo com by
. Fazer essas restrições set
pode reduzir drasticamente a sobrecarga.
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
define a"V1"
coluna enquantoset(DT, i, colVar, i)
define o nome da coluna contido nacolVar
variável (por exemplo, secolVar = "V1"
foi feito anteriormente). As aspas indicam que o nome da coluna deve ser interpretado literalmente, em vez de pesquisar a variável.