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.

Actualizar las columnas dt en base a la lista nombrada.

Digamos que tengo el siguiente datatable ‘my_dt’:

neutrones espectro geografía
2.30 -1.2 KIEL
2.54 -1.6 KIEL
2.56 -0.9 JUNG
2.31 -0.3 ANT

También tengo la siguiente lista nombrada ‘my_list’:

> my_list
$partículas   
[1] "neutrones"

$estación   
[1] NA

$energía      
[1] "espectro"

$área   
[1] "geografía"

$gamma   
[1] NA 

Los valores de esta lista corresponden a los nombres de las columnas de mi conjunto de datos (si existen, si no existen – NA).
Con base en mi conjunto de datos y esta lista, necesito verificar qué columnas existen en ‘my_dt’ y renombrarlas (basado en los nombres de ‘my_list’), y para los valores NA, necesito crear columnas llenas de NA.

Por lo tanto, quiero obtener el siguiente conjunto de datos ‘final_dt’:

partículas estación energía área gamma
2.30 NA -1.2 KIEL NA
2.54 NA -1.6 KIEL NA
2.56 NA -0.9 JUNG NA
2.31 NA -0.3 ANT NA

Intenté implementar esto usando las funciones de la familia ‘apply’, pero por el momento no puedo obtener exactamente lo que quiero.
Por lo tanto, estaría agradecido/a por cualquier ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, podemos utilizar una combinación de las funciones setnames, setcolorder y set del paquete data.table. Aquí está el código:

    library(data.table)
    
    # crear el datatable
    my_dt <- data.table(
      neutrons = c(2.30, 2.54, 2.56, 2.31),
      spectrum = c(-1.2, -1.6, -0.9, -0.3),
      geography = c("KIEL", "KIEL", "JUNG", "ANT")
    )
    
    # crear la lista
    my_list <- list(
      particles = "neutrons",
      station = NA,
      energy = "spectrum",
      area = "geography",
      gamma = NA
    )
    
    # obtener los nombres de las columnas existentes
    existing_cols <- intersect(names(my_list), names(my_dt))
    
    # establecer los nombres a los valores en my_list
    setnames(my_dt, existing_cols, unlist(my_list[existing_cols]))
    
    # crear columnas que están en my_list pero no en my_dt
    missing_cols <- setdiff(names(my_list), names(my_dt))
    for (col in missing_cols) {
      my_dt[, col := NA]
    }
    
    # reordenar las columnas
    setcolorder(my_dt, names(my_list))
    
    # ver el datatable final
    my_dt
    

    Esto debería darte la salida deseada:

       particles station energy area gamma
    1:      2.30      NA   -1.2 KIEL    NA
    2:      2.54      NA   -1.6 KIEL    NA
    3:      2.56      NA   -0.9 JUNG    NA
    4:      2.31      NA   -0.3  ANT    NA
    

    El código primero obtiene los nombres de las columnas existentes en my_dt que también están en my_list. Luego, renombra estas columnas utilizando la función setnames. A continuación, para todas las columnas en my_list que no están en my_dt, crea nuevas columnas llenas de NA utilizando un bucle for y la función set. Por último, establece el orden de las columnas para que coincida con el orden en my_list utilizando setcolorder.

Comments are closed.