Разбиваем строки на разные столбцы и объединяем их в R

#r

#r

Вопрос:

У меня есть фрейм данных с более чем 2000 строками, который повторяет этот шаблон: введите описание изображения здесь

Мне нужно что-то похожее на это:

 change_order  material   error_message
C601987       600099882  Invalid Model for Material, Invalid Material for Model
C601987       600099883  Invalid Model for Material, Invalid Material for Model
  

Мне удалось получить фрейм данных, который представляет собой только порядок изменения и номер материала, но я не могу понять, как объединить строки, начинающиеся с invalid . Любые предложения будут с благодарностью приняты.

Запрошенная информация для воспроизведения данных.

 structure(list(change_order = c("C601987", "C601987", "C601987", 
"C601987", "C601987", "C601987", "C601987", "C601987", "C601987", 
"C601987", "C601987", "C601987", "C601987", "C601987", "C601987"
), error_message = c("Material:000000000600099882 - Component:000000000600134722: Error Message - E", 
"- Invalid Model for Material", "- Invalid Material for Model", 
"Material:000000000600099882 - Component:000000000600138896: Error Message - E", 
"- Invalid Model for Material", "- Invalid Material for Model", 
"Material:000000000600099882 - Component:000000000600134722: Error Message - E", 
"- Invalid Model for Material", "- Invalid Material for Model", 
"Material:000000000600099882 - Component:000000000600138896: Error Message - E", 
"- Invalid Model for Material", "- Invalid Material for Model", 
"Material:000000000600099883 - Component:000000000600134722: Error Message - E", 
"- Invalid Model for Material", "- Invalid Material for Model"
)), row.names = c(NA, -15L), class = c("tbl_df", "tbl", "data.frame"
))
  

Комментарии:

1. Всегда ли это в наборах из 3 таких строк, с 2 строками «- Invalid …»?

2. Очень сложно протестировать / продемонстрировать код на изображениях данных. Не могли бы вы, пожалуйста, поделиться данными с возможностью копирования / вставки? dput() это лучший способ сделать это, например, dput(your_data[1:15, ]) для первых 15 строк. Это доступно для копирования / вставки и сохраняет всю информацию о классе и структуре.

3. @GregorThomas Я обновил вопрос, надеюсь, это поможет

Ответ №1:

Общая идея состоит в том, чтобы сначала разделить нужные нам значения на их собственные столбцы (материал и сообщение об ошибке). Как только у нас будут эти части в их собственных столбцах, у нас будут группирующие переменные, необходимые для агрегирования в желаемую сводку. Примечание: если вам также нужно выделить компонент, вы, по сути, сделаете то же самое, что я демонстрирую с материалом.

  library(tidyverse)
 library(stringr)

 data %>% 
    # separate material number into its own column, I coerce to numeric to trim the leading zeros
    mutate(material = as.numeric(gsub("^Material:(\d ).*$", "\1", error_message))) %>% 
    # pull the error messages into their own column
    mutate(Errors = ifelse(is.na(material), error_message, NA)) %>%
    group_by(change_order) %>%
    # fill the material ID down with the group so it can be matched with the Errors
    fill(material) %>% 
    distinct() %>% # if you care about components, don't use this line
    group_by(change_order, material) %>%
    filter(!is.na(Errors)) %>% 
    # concatenate the error messages into one row
    summarize(error_message = str_c(Errors, collapse = ", ")) %>%
    # clean up the dashes in the error messages
    mutate(error_message = gsub("- ", "", error_message, fixed = TRUE))

# A tibble: 2 x 3
# Groups:   change_order [1]
  change_order  material error_message                                         
  <chr>            <dbl> <chr>                                                 
1 C601987      600099882 Invalid Model for Material, Invalid Material for Model
2 C601987      600099883 Invalid Model for Material, Invalid Material for Model