Tenho uma coluna em um conjunto de dados parecida com esta:
cluster_id
1
1
1
1
NA
1
NA
NA
2
NA
2
NA
3
NA
NA
3
cluster_id <- c("1","1","1","1","NA","1","NA","NA","2","NA","2","NA","3","NA","NA","3")
A ordem já está predefinida antes de usar uma coluna de tempo. O que eu quero é substituir os NA's que estão dentro de cada ID de cluster, ou seja, se houver uma linha com 2, depois um NA e depois um 2 novamente, eu quero que esse NA se torne 2. Os NA's entre os números permanecem como NA's. Exemplo:
cluster_id cluster_id_new
1 1
1 1
1 1
1 1
NA 1
1 1
NA NA
NA NA
2 2
NA 2
2 2
NA NA
3 3
NA 3
NA 3
3 3
Encontrei a zoo::na.locf
função neste post , que parece estar próxima do que eu quero, mas também preciso levar em consideração o valor após o NA. Alguma ideia?
Atualização: obrigado a @Darren Tsai (que forneceu uma versão melhor):
Resposta original: Aqui está
tidyverse
uma maneira de usar principalmentefill
:O
collapse
pacote tem tanto ana_locf
quanto ana_focb
. Você pode fazer uma passagem com cada um e então verificar se há discrepâncias.Se seus valores NA forem armazenados como caracteres e não
NA_character_
, primeiro você precisa converter paraNA_character_
.A solução também depende de como você quer lidar com "NA"s iniciais/finais. A primeira opção os mantém.
Esta segunda solução usa um único
for
loop e preenche os "NA"s iniciais/finais.Se seus valores de NA forem realmente
NA
, será um pouco mais fácil.Aqui está uma opção base R com
rle
+cumsum
tal que
1) na.approx Presumivelmente, os IDs do cluster são inteiros e parecem ser incrementados em 1, portanto, realizar a interpolação linear e testar o resultado para inteiros é suficiente para determinar se o resultado deve ser NA ou não.
dando:
2) na.locf0 Se o na.locf0 para frente e para trás forem os mesmos para um NA, então ele deve ser substituído. Isso é mais geral, pois funciona diretamente com os valores de caracteres e não assume o aumento do id em 1.
Observação
Não consigo pensar em uma solução "inteligente" usando funções existentes que satisfaça seus critérios; uma abordagem de loop for funcionaria?
Criado em 2024-09-27 com reprex v2.1.0