es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo eliminar los NAs al principio y al final de un dataframe en R?

Estoy intentando interpolar algunos valores por grupo utilizando zoo:na.approx. El dataframe debe comenzar y terminar con valores no NA. ¿Hay alguna manera de eliminarlos pero mantener los NA “internos”? No puedo usar un filtro basado en otras variables ya que la interpolación se realiza por grupos y los valores faltantes varían entre ellos.

Aquí tienes un ejemplo de mi código:

library(zoo)
library(lubridate)
library(dplyr)
set.seed(471)

db <- rep(seq(ymd("2021-12-20"), ymd("2021-12-30"), by = "days"),4) %>% merge(seq(1,4,1)) %>%
  mutate(z=rnorm(176))
db$z[db$z<0] <- NA

db %>% group_by(y) %>% mutate(aa=na.approx(z))
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible eliminar los primeros y últimos valores no NA de cada grupo manteniendo los NA internos. Puedes lograr esto aplicando primero na.approx a toda la columna y luego usando los verbos de dplyr como lead y lag para eliminar los primeros y últimos valores no NA.

    Aquí tienes un código de ejemplo que demuestra este enfoque:

    library(zoo)
    library(lubridate)
    library(dplyr)
    
    set.seed(471)
    
    db <- rep(seq(ymd("2021-12-20"), ymd("2021-12-30"), by = "days"),4) %>%
      merge(seq(1,4,1)) %>%
      mutate(z=rnorm(176))
    db$z[db$z<0] <- NA
    
    db %>%
      group_by(y) %>%
      mutate(aa = na.approx(z)) %>%
      ungroup() %>% 
      mutate(aa = if_else(is.na(lag(aa)) & is.na(lead(aa)), NA_real_, aa))
    

    En este código, primero agrupamos por la variable y y aplicamos na.approx a la variable z usando mutate. Luego, usamos ungroup para eliminar la agrupación y aplicamos if_else para eliminar los primeros y últimos valores no NA usando lag y lead. La columna resultante aa tendrá los valores interpolados para z con los primeros y últimos valores no NA eliminados.

Comments are closed.