Enviado por: Matt Weller; Asignado a: Nadie; Enlace R-Forge
Cuando uso .SDcols
(con el propósito de aplicar una función a múltiples columnas) no puedo hacer referencia a otras columnas en la tabla original (v1) usando la siguiente sintaxis:
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp, :
# object 'v1' not found
Ocurre un error similar cuando uso c en lugar de list, claramente no se puede acceder a la columna v1 dentro de la cláusula j
.
Recurrí al siguiente código que incluye la columna v1, aunque no quiero que se incluya en la porción lapply
, teniendo que eliminarlo después del cálculo.
sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Según eddi en Stackoverflow, esto es un error y me ha pedido que lo informe. No puedo proporcionar muchos más detalles ya que no estoy exactamente seguro de qué parte cree que fue un error, mirando la respuesta aceptada por Arun y su discusión subsiguiente destacará dónde está el problema.
Aquí está la publicación SO relevante.
Otra publicación para actualizar: http://stackoverflow.com/questions/27755518/data-table-sd-lapply-multiple-columns-in-argument
Un poco tarde, pero agregando esta pregunta mía al montón
Ni siquiera lo pensé como un error, por lo general proporciono campos obligatorios adicionales a .SDcols
y luego en j
uso .SD[, !"total", with=FALSE]
para excluir columnas no deseadas.
Esa es otra buena solución, me pregunto cuál es la diferencia de rendimiento con respecto al uso de dt$total
. Y sí, este tipo de danza marca la línea entre FR y bug, en mi opinión.
Impulsando esto de nuevo. Parece que esto podría ser una solución muy importante. esta pregunta parece estar relacionada y podría resolverse potencialmente a través de DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]
Aquí hay otro caso simple en el que esto sería útil: http://stackoverflow.com/a/32498711/1191259
Aquí hay otro caso simple que sufre: http://stackoverflow.com/questions/32944060/using-data-table-to-calculate-new-columns/32944519#32944519
Otro para actualizar cuando se corrige: http://stackoverflow.com/q/32915770/1191259
¡Hurra! ahora podemos hacer esto:
require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# grp v1 v2 v3
# 1: 2 7 4.5 12.5
# 2: 3 12 4.0 13.0
# 3: 1 9 3.5 13.5
Se actualizaron todas las publicaciones de SO vinculadas aquí. Gracias a todos.
Gracias, @arunsrinivasan. Estuve esperando esta solución durante un par de años.
¡Impresionante! Gracias