Код R: Как я могу отфильтровать количество элементов X после совпадения строки? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть строка символов с несколькими элементами, извлеченными из PDF. Я хочу включить только 5 элементов после совпадения строк. Итак, у меня есть

c("Retail","Channel1","Discount","10/1/2019 20%","10/1/2020 20%","10/1/2021 20%",
  "Fee", "Channel1", "10/1/2019 $5","10/1/2020 5%","10/1/2021 5%"
  "Supply Chain", "Channel1","Discount", "10/1/2019 80%","10/1/2020 80%","10/1/2021 80%")

Я хочу определить «Розничная торговля», а затем включить до первого «10/1/2021 20%»

Затем я хочу обнаружить «Плата» ивключают до «10/1/2021 5%», затем «Цепочка поставок» и включают до «10/1/2021/80%»

Розница, Плата и Цепочка поставок всегда будут одинаковыми, но дата / процент все время меняется.

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

С tidyverse:

v1 <- c("Retail", "Channel1", "Discount", "10/1/2019 20%", "10/1/2020 20%", 
"10/1/2021 20%", "Fee", "Channel1", "10/1/2019 $5", "10/1/2020 5%", 
"10/1/2021 5%", "Supply Chain", "Channel1", "Discount", "10/1/2019 80%", 
"10/1/2020 80%", "10/1/2021 80%")

Здесь мы используем grepl и cumsum, чтобы создать переменную группировки для каждого совпадения строки. Затем мы выбираем 5 верхних рядов.

library(tidyverse)

data.frame(v1) %>% 
  mutate(tag = cumsum(grepl("Retail|Fee|Supply Chain", v1))) %>% 
  group_by(tag) %>% 
  top_n(5)

    Selecting by tag
# A tibble: 17 x 2
# Groups:   tag [3]
   v1              tag
   <fct>         <int>
 1 Retail            1
 2 Channel1          1
 3 Discount          1
 4 10/1/2019 20%     1
 5 10/1/2020 20%     1
 6 10/1/2021 20%     1
 7 Fee               2
 8 Channel1          2
 9 10/1/2019 $5      2
10 10/1/2020 5%      2
11 10/1/2021 5%      2
12 Supply Chain      3
13 Channel1          3
14 Discount          3
15 10/1/2019 80%     3
16 10/1/2020 80%     3
17 10/1/2021 80%     3
0 голосов
/ 11 октября 2019

Вот один вариант с base R

lapply(tapply(v1, cumsum(v1 %in%  c("Retail", "Fee", "Supply Chain")),
        head, 6), tail, -1)
#$`1`
#[1] "Channel1"      "Discount"      "10/1/2019 20%" "10/1/2020 20%" "10/1/2021 20%"

#$`2`
#[1] "Channel1"     "10/1/2019 $5" "10/1/2020 5%" "10/1/2021 5%"

#$`3`
#[1] "Channel1"      "Discount"      "10/1/2019 80%" "10/1/2020 80%" "10/1/2021 80%"

Если сюда необходимо включить «Розничная торговля», «Плата», «Цепочка поставок»

tapply(v1, cumsum(v1 %in%  c("Retail", "Fee", "Supply Chain")), head, 6)

данные

v1 <- c("Retail", "Channel1", "Discount", "10/1/2019 20%", "10/1/2020 20%", 
"10/1/2021 20%", "Fee", "Channel1", "10/1/2019 $5", "10/1/2020 5%", 
"10/1/2021 5%", "Supply Chain", "Channel1", "Discount", "10/1/2019 80%", 
"10/1/2020 80%", "10/1/2021 80%")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...