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.

Reemplazar valores NA en un marco de datos iterativamente utilizando otra columna.

Tengo un marco de datos con alrededor de 50 columnas superpuestas que necesito combinar. A continuación, se muestra un fragmento de cómo se ve el marco de datos (tiene alrededor de 150 filas y varias cientos de columnas):

ID PAI_Q1.y PAI_Q1.x
540 0 NA
680 1 NA
240 NA 2
330 NA 3

Para una sola columna, el siguiente código funciona perfectamente:

qualtrics <- qualtrics %>%
mutate(PAI_Q1 = ifelse(is.na(PAI_Q1.y), PAI_Q1.x, PAI_Q1.y))

Sin embargo, tengo dificultades para escribir esto en un bucle o una función en todas las filas que necesitan ser convertidas (es decir, PAI_Q2, PAI_Q3, etc.). A continuación se presentan los dos intentos que he hecho hasta ahora. ¿Alguien tiene sugerencias para ajustes (o conoce una función que exista) que me permita hacer esta tarea básica iterativamente?

Intento #1

mutate_col <- function(data, string, string.x, string.y){ data <- data %>% mutate(string = ifelse(is.na(string.y), string.x, string.y))
}
Error: Problema con la columna mutate() string.
x objeto ‘PAI_Q1.y’ no encontrado

Intento #2

for (i in 1:colnames(df)){
if(names(i) %in% list_of_cols){ #list of columns that must be combined
y <- paste(i, ".y", sep = "") x <- paste(i, ".x", sep = "") df <- df %>% mutate(i = ifelse(is.na(y), x, y))
}
}

ID PAI_Q1.y PAI_Q1.x i.1
540 0 NA PAI.Q1.y
680 1 NA PAI.Q1.y
240 NA 2 PAI.Q1.y
330 NA 3 PAI.Q1.y

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para iterar sobre varias columnas y combinarlas, puede usar una combinación de las funciones mutate_at, contains y coalesce del paquete dplyr. Aquí está el código:

    library(dplyr)
    
    df %>%
      mutate_at(vars(contains("_x")), list(~coalesce(., get(sub("_x", "_y", cur_column()))))) %>%
      rename_at(vars(contains("_x")), ~sub("_x", "", .))
    

    Explicación:

    • mutate_at() aplica la misma función coalesce() a varias columnas, especificadas usando vars(contains("_x")). Esto busca todos los nombres de columnas que contienen la cadena “_x”.
    • coalesce() devuelve el primer valor no faltante en un conjunto de columnas. En este caso, verifica primero la columna “_x” y si falta, toma el valor correspondiente de la columna “_y”, que se calcula usando get(sub("_x", "_y", cur_column())).
    • El resultado de mutate_at() es otro marco de datos con columnas “_x” y “_y”. Para limpiarlo, usamos rename_at() para quitar el sufijo “_x” de los nombres de columna.

    Este código debería funcionar para cualquier número de columnas con sufijos “_x” y “_y”. Simplemente ajuste el argumento contains() para que coincida con su convención de nomenclatura de columnas.

Comments are closed.