Есть несколько вещей, которые вам нужно сделать.Во-первых, это получение текста во фрейме данных.Я использовал magrittr
операторы каналов, чтобы сделать процесс немного более понятным, но он по сути делится на строки, а затем на двоеточия.
library(magrittr)
my_d <- "RecordID:Name1
VariableA:14
VariableB: 34
VariableC: 21
VariableD:red
VariableE: low
RecordID: Name2
VariableA: 31
VariableB: 21
VariableD:yellow
VariableE:high" %>%
strsplit("\n") %>%
unlist() %>%
strsplit(., ":") %>%
data.frame() %>%
t() %>%
as.data.frame(stringsAsFactors=FALSE)
rownames(my_d) <- 1:dim(my_d)[1]
colnames(my_d) <- c("colname", "value")
После этого у нас есть фрейм данных my_d
с двумя столбцами.Затем нам нужно добавить столбец, указывающий для каждого VariableX
, которому RecordID
принадлежит ...
my_d$is_RecordID <- my_d$colname == "RecordID"
runs <- rle(my_d$is_RecordID)
new_lengths <- runs$lengths %>% matrix(ncol=2) %>% apply(., 2, "sum")
new_values <- my_d$value[my_d$is_RecordID]
runs$lengths <- new_lengths
runs$values <- new_values
my_d$RecordID <- inverse.rle(runs)
Затем преобразовать «длинный» фрейм данных в «широкий» формат.
my_d_long <- my_d[!my_d$is_RecordID, c("RecordID", "colname", "value")]
my_d_wide <- reshape(my_d_long, idvar = "RecordID", timevar = "colname", direction = "wide")