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
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ónspread
del paquetetidyr
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)
animal GI PI site wks 13 wild 8 32 78 cage 12
1 cat
2 dog 0 NA
3 mouse
“`