#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