Изменить список в соответствии с тегами - PullRequest
1 голос
/ 10 июня 2019

Обновление:

Приведенные выше данные не отражают мои данные, поэтому вот обновление:

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") df <- as.data.frame(cbind(tag, content))

Мне нужно:

\ID \a \b ID_x text2 text3 ID_y text6 ID_z text7 text8 ID_f ID_g

Так что не все уникальные идентификаторы ID_ заполнены двумя переменными \ a и \ b.

Я пытался unstack, а также пытался aggreagte, но это не сработало

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

С пересмотренным вопросом, где:

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
0 голосов
/ 10 июня 2019

Если нам нужны tag в качестве имен столбцов, создайте столбец последовательности «tag» (rowid из data.table) и используйте его в dcast, чтобы преобразовать в «широкий»

library(data.table)
dcast(setDT(df), rowid(tag) ~ tag, value.var = 'content')

Обновление

В зависимости от обновления нам может потребоваться создать новый столбец ind для обозначения появления идентификатора

setDT(df)[, cumsum(tag == "\\ID")]
dcast(df, ind ~ tag, value.var = 'content')
#   ind   \\a   \\b \\ID
#1:   1 text2 text3 ID_x
#2:   2  <NA> text6 ID_y
#3:   3 text7 text8 ID_z
#4:   4  <NA>  <NA> ID_f
#5:   5  <NA>  <NA> ID_g

Для показанного примера, unstack также будет работать, так как нет дубликатов

unstack(df, content ~ tag)
...