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.
Aqui está uma função que retornará
x
quandoall_x
tiver um valor ou nenhum, ou então pegará o elementoall_x
que corresponde ao número da linha:Então é só criar o
row_number()
byid
e usarMap()
:Acho que você deve usar
ifelse
(em vez deif_else
), com o mínimo de esforço para fazê-lo voarNota: a diferença entre
if_else
eifelse
Trabalhar com
NULL
é sempre um pouco desajeitado e geralmente só funciona em um contexto de lista. Você pode substituirNULL
porNA
, dessa forma ninguém pode reclamarNULL
em um contexto que não seja de lista