Data.table: [R-Forge # 5222] 'no encontrado' cuando DT [, list (sum (non-.SD-col), lapply (.SD, mean)), by = ..., .SDcols = ...]

Creado en 8 jun. 2014  Â·  12Comentarios  Â·  Fuente: Rdatatable/data.table

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.

High bug

Todos 12 comentarios

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

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

¿Fue útil esta página
0 / 5 - 0 calificaciones