Pregunta Error de "objeto 'ansvals' no encontrado" - ¿Qué significa?


de mi data.table simple, por ejemplo, como este:

dt1 <- fread("
col1 col2 col3
AAA  ab   cd
BBB  ef   gh
BBB  ij   kl
CCC  mn   nm")

Estoy haciendo una nueva tabla, por ejemplo, así:

dt1[,
    .(col3, new=.N),
    by=col1]

>   col1 col3 new
>1:  AAA   cd   1
>2:  BBB   gh   2
>3:  BBB   kl   2
>4:  CCC   op   1

esto funciona bien cuando indico los nombres de columnas explícitamente. Pero cuando los tengo en las variables y trato de usarlos with=F, esto da un error:

colBy   <- 'col1'
colShow <- 'col3' 

dt1[,
    .(colShow, 'new'=.N),
    by=colBy,
    with=F] 
# Error in `[.data.table`(dt1, , .(colShow, new = .N), by = colBy, with = F) :   object 'ansvals' not found

No pude encontrar ninguna información sobre este error hasta el momento.


5
2017-11-22 04:56


origen


Respuestas:


La razón por la que está recibiendo este mensaje de error es que al usar with=FALSE dices tabla de datos para tratar j Como si de un marco de datos se tratara. Por lo tanto, espera un vector de nombres de columna y no una expresión para ser evaluada en j como new=.N.

De la documentación de ?data.table acerca de with:

Por defecto with=TRUE y j se evalúa dentro del marco de x; columna   los nombres se pueden usar como variables. Cuando with=FALSE j es un personaje   vector de nombres de columna o un vector numérico de posiciones de columna para   Seleccione, y el valor devuelto siempre es una tabla de datos.

Cuando usas with=FALSE, debes seleccionar los nombres de columna en j sin un . antes de () Me gusta esto: dt1[, (colShow), with=FALSE]. Otras opciones son dt1[, c(colShow), with=FALSE] o dt1[, colShow, with=FALSE]. El mismo resultado se puede obtener mediante el uso de dt1[, .(col3)]

Para resumir: with = FALSE se utiliza para seleccionar las columnas marco de datos camino. Entonces, deberías hacerlo entonces como tal.

También al usar by = colBy tu estas diciendo tabla de datos para evaluar j que está en contradicción con with = FALSE.

De la documentación de ?data.table acerca de j:

Un solo nombre de columna, expresión única de los nombres de columna, list() de   expresiones de nombres de columna, una expresión o llamada de función que   evalúa a la lista (incluidos data.frame y data.table que están   listas, también), o (cuando with=FALSE) un vector de nombres o posiciones para   seleccionar.

j se evalúa dentro del marco de la tabla de datos; es decir,   Ve los nombres de las columnas como si fueran variables. Utilizar j=list(...) regresar   Múltiples columnas y / o expresiones de columnas. Una sola columna o   la expresión única devuelve ese tipo, generalmente un vector. Ver el   ejemplos.

Ver también puntos 1.d y 1.g de la viñeta de introducción de tabla de datos.


ansvals es un nombre usado en tabla de datos internos. Puedes ver dónde aparece en el código usando ctrl+F (Windows) o cmd+F (Mac OS) aquí.


7
2017-11-22 08:14



El error object 'ansvals' not found Me parece un bicho. Debería ser un mensaje útil o simplemente funcionar. He archivado problema # 1440 volviendo a esta pregunta, gracias.

Jaap es completamente correcto. Siguiendo con su respuesta, puedes usar get() en j Me gusta esto :

dt1
#   col1 col2 col3
#1:  AAA   ab   cd
#2:  BBB   ef   gh
#3:  BBB   ij   kl
#4:  CCC   mn   nm
colBy
#[1] "col1"
colShow
#[1] "col3"
dt1[,.(get(colShow),.N),by=colBy]
#   col1 V1 N
#1:  AAA cd 1
#2:  BBB gh 2
#3:  BBB kl 2
#4:  CCC nm 1

1
2017-11-23 09:41