Data.table: rbindlist(..., fill=TRUE) devrait-il renvoyer NA_logical_ dans les colonnes de la liste ?

Créé le 25 janv. 2020  ·  6Commentaires  ·  Source: Rdatatable/data.table

À partir de #4196 :

Lors du remplissage d'une colonne de liste, rbindlist s'écarte du comportement de tous les autres types de colonnes et renvoie des éléments NULL au lieu 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   

Attendu:

> 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   

Devrions-nous changer ce comportement pour que les colonnes de liste remplissent les lignes avec des valeurs NA pour correspondre au comportement de fill=TRUE pour les autres types de colonnes ?

non-atomic column question

Commentaire le plus utile

Et si nous ajoutions simplement une phrase à la documentation en notant le comportement dans le cas d'une colonne de liste manquante :

Entrée actuelle pour l'argument de remplissage :

TRUE remplit les colonnes manquantes avec les NA. Par défaut FAUX. Lorsque TRUE, use.names est défini sur TRUE.

Proposé :

TRUE remplit les colonnes manquantes avec des NA, ou NULL pour les colonnes de liste manquantes. Par défaut FAUX. Lorsque TRUE, use.names est défini sur TRUE.

Tous les 6 commentaires

PR avec correctif fourni si nous voulons faire le changement

Le comportement actuel me semble correct.

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

OMI, cela ne devrait pas être NA car :

  • il change le type d'un champ manquant (non défini) en un vecteur logique
  • il change la longueur de la longueur 0 à la longueur 1

Je penche pour le point de Jan. Le comportement actuel de l'élément vide est en fait la façon dont une liste représente les manquants (il n'y a aucun objet vers lequel pointer). Nous pourrions construire un exemple où chaque élément de la liste était un vecteur logique, chaque élément étant le résultat d'un calcul. Dans un tel cas, 3 états différents pourraient devoir être représentés : longueur 0 logique, longueur 1 NA logique et calcul manquant. Si la longueur 1 NA logique était utilisée pour les manquants, ces 2 ne pouvaient pas être distingués.

Changer de méthode d'impression suffirait-il ? Au lieu que rien ne soit imprimé, que diriez-vous de NULL ? L'impression de NA pourrait à nouveau impliquer une longueur 1 NA logique, alors que NULL serait sans ambiguïté, cohérent avec ce que la base R imprime pour les éléments de liste vides, et donnerait un rappel visuel supplémentaire qu'il s'agissait d'une liste colonne.

également d'accord avec Jan, en particulier sur la longueur 0 --> la longueur 1.

J'utilise beaucoup lengths(x)>0 pour filtrer les lignes par colonnes de liste vides.

nous pourrions, je suppose, y mettre logical() à la place, y a-t-il un avantage de logical() par rapport à NULL?

Et si nous ajoutions simplement une phrase à la documentation en notant le comportement dans le cas d'une colonne de liste manquante :

Entrée actuelle pour l'argument de remplissage :

TRUE remplit les colonnes manquantes avec les NA. Par défaut FAUX. Lorsque TRUE, use.names est défini sur TRUE.

Proposé :

TRUE remplit les colonnes manquantes avec des NA, ou NULL pour les colonnes de liste manquantes. Par défaut FAUX. Lorsque TRUE, use.names est défini sur TRUE.

Le changement de doc semble bon. Plus le changement de méthode d'impression que j'ai suggéré aussi ?

Cette page vous a été utile?
0 / 5 - 0 notes