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.

Dataframe de un vector de caracteres donde el nombre de la variable y sus datos son almacenados conjuntamente.

Tengo esta situación:

foo <- data.frame("vars" = c("animal: mouse | wks: 12 | site: cage | PI: 78",
                             "animal: dog | wks: 32 | GI: 0.2",
                             "animal: cat | wks: 8 | site: wild | PI: 13"))

donde los nombres de las variables y los datos relativos se almacenaron en cadenas de caracteres como en el ejemplo anterior. En particular, cada unidad nombre_de_variable/sus_datos está delimitada por un |. Después de los : se encuentran los datos relativos.

Me gustaría tener un dataframe final como este:

r
animal wks site PI GI
mouse 12 cage 78 NA
dog 32 <na> NA 0.2
cat 8 wild 13 NA

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, podemos usar la función strsplit para dividir cada cadena de caracteres por el delimitador |, y luego nuevamente por : dentro de cada elemento de la lista resultante. Luego, podemos extraer los nombres de las variables y sus respectivos datos y almacenarlos en un nuevo marco de datos. Después, podemos utilizar la función spread del paquete tidyr para convertir el marco de datos amplio en uno largo con valores faltantes.

    Aquí está el código para lograr esto:

    “`{r}
    library(tidyr)

    dividir cada cadena de caracteres por el delimitador “|”, y luego por “:”

    split_vars <- strsplit(foo$vars, “\s[|:]\s“)

    extraer los nombres de las variables y sus respectivos datos

    var_names <- unique(sapply(split_vars, “[[“, 1))
    data_list <- lapply(split_vars, function(x) setNames(x[2], x[1]))
    data_df <- do.call(rbind, data_list)
    data_df[, “variable”] <- gsub(“.\s([a-zA-Z]+):.“, “\1”, rownames(data_df))

    convertir el marco de datos amplio en uno largo con valores faltantes

    final_df <- spread(data_df, variable, x)


    El marco de datos `final_df` resultante debería verse así:

    animal GI PI site wks
    1 cat 13 wild 8
    2 dog 0 NA
    32
    3 mouse
    78 cage 12
    “`

Comments are closed.