Data.table: ¿Debería rbindlist (..., fill = TRUE) devolver NA_logical_ en las columnas de la lista?

Creado en 25 ene. 2020  ·  6Comentarios  ·  Fuente: Rdatatable/data.table

De # 4196:

Al llenar una columna de lista, rbindlist se aparta del comportamiento de todos los demás tipos de columna y devuelve elementos NULL en lugar de NA:

> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
      c1     c2
   <num> <list>
1:     0  1,2,3
2:     1   

Esperado:

> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
      c1     c2
   <num> <list>
1:     0  1,2,3
2:     1  NA   

¿Deberíamos cambiar este comportamiento para que las columnas de la lista llenen las filas con valores NA para que coincida con el comportamiento de fill = TRUE para otros tipos de columnas?

non-atomic column question

Comentario más útil

¿Qué pasa si, en cambio, agregamos una oración a la documentación señalando el comportamiento en el caso de una columna de lista faltante:

Entrada actual para el argumento de relleno:

VERDADERO llena las columnas faltantes con NA. Por defecto FALSO. Cuando es TRUE, use.names se establece en TRUE.

Propuesto:

TRUE llena las columnas faltantes con NA o NULL para las columnas de lista faltantes. Por defecto FALSO. Cuando es TRUE, use.names se establece en TRUE.

Todos 6 comentarios

PR con arreglo proporcionado si queremos hacer el cambio

El comportamiento actual me parece bien.

> str(as.integer(NULL)[1L])
 int NA
> str(as.list(NULL)[1L])
List of 1
 $ : NULL

En mi opinión, no debería ser NA porque:

  • cambia el tipo de un campo faltante (indefinido) a un vector lógico
  • cambia la longitud de longitud 0 a longitud 1

Me estoy inclinando hacia el punto de Jan. El comportamiento actual del elemento vacío es en realidad la forma en que una lista representa la falta (no hay ningún objeto al que señalar). Podríamos construir un ejemplo en el que cada elemento de la lista fuera un vector lógico, siendo cada elemento el resultado de algún cálculo. En tal caso, es posible que sea necesario representar 3 estados diferentes: longitud 0 lógica, longitud 1 NA lógica y cálculo faltante. Si se usó la longitud 1 NA lógica para faltar, esos 2 no se podrían distinguir.

¿Sería suficiente cambiar el método de impresión? En lugar de que no se imprima nada, ¿qué tal NULL ? Imprimir NA podría implicar nuevamente una longitud 1 NA lógica, mientras que NULL sería inequívoco, consistente con lo que imprime la base R para elementos de lista vacíos, y daría un recordatorio visual adicional de que era una lista columna.

también estoy de acuerdo con w Jan, en particular sobre la longitud 0 -> longitud 1.

Estoy usando longitudes (x)> 0 mucho para filtrar filas por columnas de lista vacías.

Supongo que podríamos poner lógico () allí, ¿hay alguna ventaja de lógico () sobre NULL?

¿Qué pasa si, en cambio, agregamos una oración a la documentación señalando el comportamiento en el caso de una columna de lista faltante:

Entrada actual para el argumento de relleno:

VERDADERO llena las columnas faltantes con NA. Por defecto FALSO. Cuando es TRUE, use.names se establece en TRUE.

Propuesto:

TRUE llena las columnas faltantes con NA o NULL para las columnas de lista faltantes. Por defecto FALSO. Cuando es TRUE, use.names se establece en TRUE.

El cambio de doc se ve bien. ¿Además del cambio de método de impresión que sugerí también?

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