Qual é a melhor maneira de atribuir a várias colunas usando data.table
? Por exemplo:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Gostaria de fazer algo assim (é claro que esta sintaxe está incorreta):
x[ , (col1, col2) := f(), by = "id"]
E para estender isso, eu posso ter muitas colunas com nomes armazenados em uma variável (por exemplo col_names
) e gostaria de fazer:
x[ , col_names := another_f(), by = "id", with = FALSE]
Qual é a maneira correta de fazer algo assim?
by
como é correto dizer @Christoph_J. Link para sua pergunta adicionada à FR # 2120 "Solte a necessidade com = FALSE for LHS of: =", para que não se esqueça de revisitar.f()
é uma função que retorna vários valores, um para cada uma de suas colunas.Respostas:
Agora isso funciona na v1.8.3 no R-Forge. Obrigado por destacá-lo!
Versão mais antiga usando o
with
argumento (nós desencorajamos esse argumento quando possível):fonte
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(Estou usandodata.table
1.8.11)dim
retorna um vetor tão convertido que para digitarlist
deve girá-lo; por exemplo[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. O problema é queas.list
tem sobrecarga de chamada e também copia o vetor pequeno. Se a eficiência for um problema à medida que o número de grupos aumentar, informe-nos.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) agora lança um aviso, então talvez o remova? Em uma nota relacionada, alguém sugeriu que, comoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
uma tarefa comox[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
deveria de fato funcionar? Parece que isso seria consistente com as outras alterações, embora eu acho que possa quebrar muito código de usuário existente (?).by=a
ele funcionará, mas retorne uma resposta diferente. Os agregadosmean(a)
esum(a)
estão sendo reciclados dentro de cada grupo quandoby=a
. Semby=a
ele, basta colar omean
esum
para a coluna inteira em cada célula (ou seja, números diferentes).A seguinte notação abreviada pode ser útil. Todo o crédito é para Andrew Brooks, especificamente este artigo .
fonte