Quero vincular linhas de dois quadros de dados diferentes, onde um quadro de dados contém uma coluna de valores hash, enquanto o segundo quadro de dados não contém esta coluna.
library(tidyverse)
library(openssl)
df <- data.frame(x = sha3(letters[1:3], size = 512),
y = 1:3)
df2 <- data.frame(y = 4:6)
df |>
bind_rows(df2)
Ao tentar vincular linhas, recebo o seguinte erro:
Error in `bind_rows()`:
! Can't combine `..1` <hash> and `..2` <vctrs:::common_class_fallback>.
Run `rlang::last_trace()` to see where the error occurred.
De alguma forma, entendi de onde vem isso, porque o segundo quadro de dados não contém a coluna x. No entanto, minha saída esperada/desejada seria que bind_rows ainda funcionaria e apenas preencheria a coluna x com NA
for df2
.
EDITAR:
Criei uma pequena solução alternativa simplesmente convertendo a coluna hash de df de volta para caractere, mas ainda estou curioso para saber se poderia evitar o erro em primeiro lugar.
O problema não é específico de hashes. Ocorre se você tiver um objeto para o qual nenhum
c
método está definido.bind_rows
usavctrs::vec_rbind
e a documentação diz:Este não é o caso exato aqui (nenhuma classe comum), mas vemos
<vctrs:::common_class_fallback>
na mensagem de erro. Se definirmos um simples,c.hash
funciona de alguma forma. Infelizmente, isso não preserva a classe. Eu não sei por quê.Eu recomendo usar
rbind.fill
:Isso porque
sha3()
transforma o vetor em um hash. Você pode transformá-lo, por exemplo. comas.character()
,A saída é:
Na base podemos fazer
onde
new
está um novo objeto de classdata.frame
.