С пересмотренным вопросом, где:
df <- data.frame(tag = c("\\ID", "\\a", "\\b", "\\ID", "\\b", "\\ID", "\\a", "\\b", "\\ID", "\\ID"),
content = c("ID_x", "text2", "text3", "ID_y", "text6", "ID_z", "text7", "text8", "ID_f", "ID_g"),
stringsAsFactors = FALSE)
Самое сложное - как-то сгруппировать строки по идентификатору. Мое решение использует fill
из библиотеки tidyr
для распространения значения вниз в data.frame.
library("dplyr")
df %>%
# Create a proper id column
mutate(id = ifelse(tag == "\\ID", content, NA)) %>%
# fill all ids based on the last id observed
tidyr::fill(id) %>%
# format the data in the desired shape
tidyr::spread(tag, content) %>%
# discarding our now redundant id column and re-arranging columns
select(-id) %>%
select(`\\ID`, everything())
Результат:
# \\ID \\a \\b
# 1 ID_f <NA> <NA>
# 2 ID_g <NA> <NA>
# 3 ID_x text2 text3
# 4 ID_y <NA> text6
# 5 ID_z text7 text8
Я думаю, что NA имеют больше смысла, однако, если вы хотите вместо этого что-то еще, вы можете просто передать fill = ""
в tidyr::spread
, чтобы заполнить пропущенные значения альтернативным значением по умолчанию, например, пустая строка ""
.
# \\ID \\a \\b
# 1 ID_f
# 2 ID_g
# 3 ID_x text2 text3
# 4 ID_y text6
# 5 ID_z text7 text8