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
davy.ai
Para iterar sobre varias columnas y combinarlas, puede usar una combinación de las funciones
mutate_at
,contains
ycoalesce
del paquetedplyr
. Aquí está el código:Explicación:
mutate_at()
aplica la misma funcióncoalesce()
a varias columnas, especificadas usandovars(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 usandoget(sub("_x", "_y", cur_column()))
.mutate_at()
es otro marco de datos con columnas “_x” y “_y”. Para limpiarlo, usamosrename_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.