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.

Combina pares de variables dentro de un marco de datos basándose en una expresión regular.

Quiero usar dplyr::coalesce para encontrar el primer valor no faltante entre pares de variables en un dataframe que contiene múltiples pares de variables. El objetivo es crear un nuevo dataframe que tenga ahora solo una copia para cada par de variables (una variable de coalesce sin valores NA).

Aquí hay un ejemplo:

df <- data.frame(
      A1=c(NA, NA, 3, 4, 5),
      A2=c(1, 2, NA, NA, NA),
      B1=c(NA, NA, 13, 14, 15),
      B2=c(11, 12, NA, NA, NA))

Resultado esperado:

A  B
1  11
2  12
3  13
4  14
5  15

Supongo que se podría usar una combinación de dplyr::coalesce con tal vez dplyr::mutate_at basado en expresiones regulares, pero no estoy seguro de cómo hacerlo. ¿Hay alguna manera de completar esta tarea con la gramática tidyverse?

¡Gracias!

EDIT: ¡gracias a todos por sus respuestas! Sin embargo, debería haber incluido la convención de nomenclatura para mis variables para facilitar la transferencia de sus respuestas a mi problema real. Lamento eso. Mis variables son variables de geoquímica nombradas en dos partes (nombre del elemento químico más nombre del núcleo).

Ejemplo: Al_TAC4.25.275 donde Al es el elemento y TAC4.25.275 es el núcleo. Quiero coalescer los datos de 3 núcleos diferentes (segunda parte del nombre) para cada elemento (primera parte del nombre). Tengo 25 pares de elementos para coalescer.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar la función dplyr::coalesce para lograr esta tarea. Una forma de hacerlo es utilizando dplyr::mutate_at y especificando los pares de variables a coalescer utilizando expresiones regulares. Aquí tienes un ejemplo:

    library(dplyr)
    
    df <- data.frame(
      A_1 = c(NA, NA, 3, 4, 5),
      A_2 = c(1, 2, NA, NA, NA),
      B_1 = c(NA, NA, 13, 14, 15),
      B_2 = c(11, 12, NA, NA, NA)
    )
    
    df %>%
      mutate_at(vars(matches("\\d")), ~ coalesce(.))
    

    En este ejemplo, estamos utilizando mutate_at para aplicar la función coalesce a todas las variables en el dataframe que contienen un dígito (es decir, todos los pares de variables que queremos coalescer). La expresión regular \\d coincide con cualquier dígito, y la función matches se utiliza para seleccionar las columnas que coinciden con la expresión regular. El símbolo ~ indica que vamos a especificar una función, y el . se refiere a las variables seleccionadas. La función coalesce reemplaza todos los valores NA con el primer valor no faltante para cada par de variables.

    Esto debería darte la salida esperada, con una columna por par de variables (es decir, una columna para A y una para B). Ten en cuenta que es posible que necesites ajustar la expresión regular para que coincida con la convención de nomenclatura de tus variables.

Comments are closed.