r data.table

Nombres dinámicos de columna en data.table



(2)

Desde data.table 1.9.4 , puedes hacer esto:

## A parenthesized symbol, `(cn)`, gets evaluated to "blah" before `:=` is carried out test_dtb[, (cn) := mean(a), by = id] head(test_dtb, 4) # a b id blah # 1: 41 19 1 54.2 # 2: 4 99 2 50.0 # 3: 49 85 3 46.7 # 4: 61 4 4 57.1

Ver detalles en ?:= :

DT[i, (colvector) := val]

[...] Sintaxis AHORA [...] PREFERIDA. Los parens son suficientes para evitar que el LHS sea un símbolo; igual que c(colvector)

Respuesta original:

[.data.table exactamente en el camino correcto: construir una expresión para ser evaluada dentro de la llamada a [.data.table es la forma data.table de hacer este tipo de cosas. Yendo un poco más allá, ¿por qué no construir una expresión que evalúe todo el argumento j (en lugar de solo su lado izquierdo)?

Algo como esto debería hacer el truco:

## Your code so far library(data.table) test_dtb <- data.table(a=sample(1:100, 100),b=sample(1:100, 100),id=rep(1:10,10)) cn <- "blah" ## One solution expr <- parse(text = paste0(cn, ":=mean(a)")) test_dtb[,eval(expr), by=id] ## Checking the result head(test_dtb, 4) # a b id blah # 1: 30 26 1 38.4 # 2: 83 82 2 47.4 # 3: 47 66 3 39.5 # 4: 87 23 4 65.2

Estoy tratando de agregar columnas a mi data.table , donde los nombres son dinámicos. Además, necesito usar el argumento by al agregar estas columnas. Por ejemplo:

test_dtb <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10,10)) cn <- parse(text = "blah") test_dtb[ , eval(cn) := mean(a), by = id] # Error in `[.data.table`(test_dtb, , `:=`(eval(cn), mean(a)), by = id) : # LHS of := must be a single column name when with=TRUE. When with=FALSE the LHS may be a vector of column names or positions.

Otro intento:

cn <- "blah" test_dtb[ , cn := mean(a), by = id, with = FALSE] # Error in `[.data.table`(test_dtb, , `:=`(cn, mean(a)), by = id, with = FALSE) : ''with'' must be TRUE when ''by'' or ''keyby'' is provided

Actualización de Mateo:

Esto ahora funciona en v1.8.3 en R-Forge. Gracias por destacar!
Vea esta pregunta similar para nuevos ejemplos:

Asignar múltiples columnas usando data.table, por grupo


La expresión se puede construir con bquote.

cn <- "blah" expr <- bquote(.(as.name(cn)):=mean(a)) test_dtb[,eval(expr), by=id]