Tenho os seguintes dados:
df <- structure(list(id = c("1358792", "1358792", "333482", "333482", "747475", "747475"),
x = c("123", "123", "456", "456", NA, NA),
all_x = list("123", "123",
c("456", "789"),
c("456", "789"),
list(),
list())),
row.names = c(NA, -6L),
class = "data.frame")
id x all_x
1 1358792 123 123
2 1358792 123 123
3 333482 456 456, 789
4 333482 456 456, 789
5 747475 <NA> NULL
6 747475 <NA> NULL
A coluna all_x é uma lista com um valor VAZIO/NULO, um único caractere ou um vetor de caracteres.
Quero criar uma nova coluna (estilo tidyverse) com a seguinte lógica: quando a all_x
coluna tiver um ou nenhum valor, basta pegar o valor de x
. Se tiver dois valores (ou seja, for um vetor de caracteres), queremos agrupar por id
e pegar o elemento que corresponde ao número da linha, ou seja, para o primeiro valor id, pegar o primeiro elemento do vetor de caracteres, para o segundo elemento id, pegar o segundo valor de caractere e assim por diante.
A saída desejada seria uma coluna de caracteres adicional com os respectivos valores, ou seja
id x all_x x2
1 1358792 123 123 123
2 1358792 123 123 123
3 333482 456 456, 789 456
4 333482 456 456, 789 789
5 747475 <NA> NULL <NA>
6 747475 <NA> NULL <NA>
Eu tentei várias variantes com if_else
, ifelse
e deslistagem e indexação, mas ainda assim sempre recebo erros devido à estrutura mista da all_x
coluna.
Aqui está o mais próximo que cheguei:
library(tidyverse)
df |>
mutate(x2 = if_else(lengths(all_x) > 1, all_x[[1]][row_number()], x), .by = id)
No entanto, obviamente, não tenho sucesso.