Data.table: Deve rbindlist (..., fill = TRUE) retornar NA_logical_ nas colunas da lista?

Criado em 25 jan. 2020  ·  6Comentários  ·  Fonte: Rdatatable/data.table

De # 4196:

Ao preencher uma coluna da lista, rbindlist se afasta do comportamento de todos os outros tipos de coluna e retorna elementos NULL em vez 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   

Devemos mudar esse comportamento para as colunas da lista para preencher as linhas com valores NA para corresponder ao comportamento de fill = TRUE para outros tipos de coluna?

non-atomic column question

Comentários muito úteis

E se, em vez disso, adicionarmos uma frase à documentação, observando o comportamento no caso de uma coluna da lista ausente:

Entrada atual para o argumento de preenchimento:

TRUE preenche as colunas ausentes com NAs. Por padrão, FALSE. Quando TRUE, use.names é definido como TRUE.

Proposta:

TRUE preenche colunas ausentes com NAs ou NULL para colunas de lista ausentes. Por padrão, FALSE. Quando TRUE, use.names é definido como TRUE.

Todos 6 comentários

PR com correção fornecida se quisermos fazer a mudança

O comportamento atual parece bom para mim.

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

IMO, não deve ser NA porque:

  • ele muda o tipo de um campo ausente (indefinido) para um vetor lógico
  • muda o comprimento de 0 para 1

Estou inclinado para o ponto de Jan. O comportamento atual de um elemento vazio é, na verdade, uma forma de lista de representar o que está faltando (não há nenhum objeto para o qual apontar). Poderíamos construir um exemplo em que cada item da lista fosse um vetor lógico, cada item sendo o resultado de algum cálculo. Nesse caso, 3 estados diferentes podem precisar ser representados: comprimento 0 lógico, comprimento 1 NA lógico e computação ausente. Se o comprimento 1 NA lógico foi usado para ausente, aqueles 2 não puderam ser distinguidos.

Mudar o método de impressão seria suficiente? Em vez de nada ser impresso, que tal NULL ? Imprimir NA poderia implicar novamente em um comprimento 1 NA lógico, enquanto NULL não seria ambíguo, consistente com o que a base R imprime para itens de lista vazios, e daria um lembrete visual adicional de que era uma lista coluna.

também concordo com Jan, em particular sobre o comprimento 0 -> comprimento 1.

Estou usando muito lengths (x)> 0 para filtrar linhas por colunas de lista vazias.

poderíamos, suponho, colocar lógico () lá, há alguma vantagem de lógico () em relação a NULL?

E se, em vez disso, adicionarmos uma frase à documentação, observando o comportamento no caso de uma coluna da lista ausente:

Entrada atual para o argumento de preenchimento:

TRUE preenche as colunas ausentes com NAs. Por padrão, FALSE. Quando TRUE, use.names é definido como TRUE.

Proposta:

TRUE preenche colunas ausentes com NAs ou NULL para colunas de lista ausentes. Por padrão, FALSE. Quando TRUE, use.names é definido como TRUE.

A mudança de documento parece boa. Além da mudança no método de impressão que eu sugeri também?

Esta página foi útil?
0 / 5 - 0 avaliações