Создайте новый категориальный столбец на основе условий значений в других столбцах в кадре данных в R - PullRequest
0 голосов
/ 27 февраля 2020

Хотя может показаться, что это было ранее решено в других вопросах , моя проблема немного сложнее.

Давайте начнем с примера, который я скопировал / вставил из Cal c лист:

enter image description here

Это минимальный воспроизводимый требуемый пример:

Label <- c("Catalog codes:" , "Themes:", "Size:", "Score:", "Buy Now:",
           "Series:", "Catalog codes:", "Themes:", "Related items:", "Buy Now:",
           "Catalog codes:", "Themes:", "Size:", "Score:",
           "Series:", "Themes:", "Size:", "Score:", "Related items:",
           "Catalog codes:", "Themes", "Size:", "Score:", "Related items:", "Buy Now:")
example <- as.data.frame(Label)

Часть имеющегося у меня кадра данных R столбец с таким столбцом (Label) и множеством строк.

Дело в том, что группа строк принадлежит одной категории (скажем, Group 1 и т. д.). Вы можете идентифицировать различные группы на розовом и белом фоне на предыдущем изображении.

Хотя в каждой группе внутренний порядок меток, не все группы содержат одинаковые метки .

Однако начальная и конечная метки в каждой группе остаются одинаковыми , в зависимости от присутствующей метки. Вы можете видеть, что Catalog codes: и Series: начинают каждую группу, тогда как Buy Now:, Score: и Related items: заканчивают каждую группу.

Я хотел бы создать второй столбец в этом кадре данных, который мог бы определить шаблоны или комбинации этих конечных / начальных меток, а затем классифицировать их. Результат может быть похож на это изображение:

enter image description here

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Если вы ищете начальные метки и конечные метки с помощью grepl(), вы можете сместить конечную метку для одной строки и посмотреть, где совпадают начальная и конечная метки, и использовать ее для создания идентификатора группы с помощью cumsum(). Это гарантирует, что вы всегда группируете все между первой начальной меткой группы и последней конечной меткой группы, так как в группе может быть несколько меток.

Label <- c("Catalog codes:" , "Themes:", "Size:", "Score:", "Buy Now:",
           "Series:", "Catalog codes:", "Themes:", "Related items:", "Buy Now:",
           "Catalog codes:", "Themes:", "Size:", "Score:",
           "Series:", "Themes:", "Size:", "Score:", "Related items:",
           "Catalog codes:", "Themes", "Size:", "Score:", "Related items:", "Buy Now:")
example <- as.data.frame(Label)


example$Group <- paste("Group", 
                       cumsum(
                         grepl("Catalog codes:|Series:", example$Label) * c(TRUE, head(grepl("Buy Now:|Score:|Related items:", example$Label), -1))
                       )
)

# Result
            Label   Group
1  Catalog codes: Group 1
2         Themes: Group 1
3           Size: Group 1
4          Score: Group 1
5        Buy Now: Group 1
6         Series: Group 2
7  Catalog codes: Group 2
8         Themes: Group 2
9  Related items: Group 2
10       Buy Now: Group 2
11 Catalog codes: Group 3
12        Themes: Group 3
13          Size: Group 3
14         Score: Group 3
15        Series: Group 4
16        Themes: Group 4
17          Size: Group 4
18         Score: Group 4
19 Related items: Group 4
20 Catalog codes: Group 5
21         Themes Group 5
22          Size: Group 5
23         Score: Group 5
24 Related items: Group 5
25       Buy Now: Group 5
0 голосов
/ 27 февраля 2020

Этот ответ не полностью соответствует желаемому результату ... см. Вывод ниже ... Пожалуйста, уточните, почему в строке 6 нет своей «собственной» группы, как это было задано в комментариях.

library( data.table )
setDT(example)[, Group := paste0( "Group ", 
                                  cumsum( grepl( "^Catalog codes|^Series", Label ) ) 
                                  ) ]
#              Label   Group
#  1: Catalog codes: Group 1
#  2:        Themes: Group 1
#  3:          Size: Group 1
#  4:         Score: Group 1
#  5:       Buy Now: Group 1
#  6:        Series: Group 2   <-- !!
#  7: Catalog codes: Group 3   <-- !!
#  8:        Themes: Group 3
#  9: Related items: Group 3
# 10:       Buy Now: Group 3
# 11: Catalog codes: Group 4
# 12:        Themes: Group 4
# 13:          Size: Group 4
# 14:         Score: Group 4
# 15:        Series: Group 5
# 16:        Themes: Group 5
# 17:          Size: Group 5
# 18:         Score: Group 5
# 19: Related items: Group 5
# 20: Catalog codes: Group 6
# 21:         Themes Group 6
# 22:          Size: Group 6
# 23:         Score: Group 6
# 24: Related items: Group 6
# 25:       Buy Now: Group 6
# Label   Group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...