объединять строки с одинаковыми значениями столбцов, но не идентичными значениями столбцов - PullRequest
0 голосов
/ 13 октября 2018

Я возиться с набором данных о моих финансах за последние 10 недель ... Я пытаюсь суммировать суммы, потраченные / внесенные по каждому описанию магазина ... Я смог это сделать.

 totalofeachstore <- FullStatement %>% group_by( Description) %>% 
 summarise_at(vars(Amount), funs(sum(., na.rm = TRUE)))

или

 totalofeachstore <- totalofeachstore %>%
 group_by(Description) %>%
 summarize(Amount = sum(Amount))  

проблема, которую я нахожу, состоит в том, что многие магазины включают свой магазин # или описание в мои заявления ... Примером может быть.

 Arco Gas #345   -$45.54
 Arco Gas #678   -$52.72

Из-заВ магазине # суммы не рушатся, как я ожидал.Есть ли способ свернуть / суммировать строки с одинаковыми именами, которые не идентичны?Например, в следующих именах магазинов ... Могу ли я свернуть все магазины Amazon на основе ключевого слова AMAZON или еще лучше, из-за нечетных AMZN и AMZ, которые находятся на 4-м и 5-м месте в списке?буквы?

 AMAZON.COM*MT2M03AW1 AM PURCHASE AMZN.COM/BILL WA -8.08
 AMAZON.COM*MT80Z2EC0 AM PURCHASE AMZN.COM/BILL WA -13.28
 AMAZON.COM*MT8G19G51 AM PURCHASE AMZN.COM/BILL WA -31.03
 AMZ*Stride Rite PURCHASE Customerservi NY         -35.20
 AMZN MKTP US AMZN.COM/B PURCHASE AMZN.COM/BILL WA -181.08
 ARBYS 0154 PURCHASE                              -13.90
 ARCO #42472 AM PURCHASE                          -30.73
 ARCO #42493 AM PURCHASE                          -29.35
 AUNT CHILADA'S PURCHASE                          -15.98

Я нашел похожие вопросы о свертывании одинаковых строк, но они не пытались суммировать в одно и то же время ... эти вопросы следующие.

R объединить строкис похожими значениями R: объединить строки с общей информацией

EDIT1 после некоторого дополнительного поиска в Google. Я нашел несколько предложений "regex", которые могут быть в состоянии сделать то, что я ищудля ... Однако я понятия не имею, как эти работы и выполнение? grep мне не очень помогли ... Это выглядит немного сложнее, чем я сейчас понимаю ... Может кто-нибудь помочь мне разобраться с этим?

из? Grep в R.

 grep, grepl, regexpr, gregexpr and regexec search for matches to argument 
 pattern within each element of a character vector: they differ in the 
 format of and amount of detail in the results.

 sub and gsub perform replacement of the first and all matches respectively.

 grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,
 fixed = FALSE, useBytes = FALSE, invert = FALSE)

 grep("[a-z]", letters)

 txt <- c("arm","foot","lefroo", "bafoobar")
 if(length(i <- grep("foo", txt)))
 cat("'foo' appears at least once in\n\t", txt, "\n")
 i # 2 and 4
 txt[i]

EDIT2: На основании приведенного ниже предложения был испробован этот код:

  Totals2 <- totalofeachstore %>%
  +   #remove everything after a *
  +   mutate(store_name = gsub("\\*.*","",Description),
  +          #remove everything after a space and a #
  +          store_name = gsub("\\ #.*","",store_name),
  +          #remove everything after a space and a number sequence
  +          store_name = gsub("\\ [0-9].*","",store_name),
  +          #assign the other Amazon purchases to Amazon
  +          store_name = 
         ifelse(str_detect(store_name,'AMZ')==TRUE,'AMAZON.COM',store_name))

, но с ошибкой следующегоr продолжает выскакивать ... Я не думал, что gsub был частью пакета, отличного от base ..., но похоже, что я не загружал пакет, содержащий "str_detect" или что-то в этом роде.

 Error in mutate_impl(.data, dots) : 
 Evaluation error: could not find function "str_detect".

РЕДАКТИРОВАТЬ 3: Совершенство!

Использование пакета "tidyverse" исправило ошибку, которую я получал, и все работает точно так, как описано, и это именно то, что я искал.

1 Ответ

0 голосов
/ 13 октября 2018

Есть ли достаточно последовательный шаблон, который вы можете использовать?Из приведенного вами примера кажется, что # и * можно использовать для отделения бизнеса от подкатегорий.

Таким образом, вы можете сделать что-то подобное в dplyr:

df <- tibble(payment_amt = c(-8.08,-13.28,-31.03,-35.20,-181.08,-13.90,-30.73,-29.35,-15.98),
               description = c('AMAZON.COM*MT2M03AW1 AM PURCHASE AMZN.COM/BILL WA',
                           'AMAZON.COM*MT80Z2EC0 AM PURCHASE AMZN.COM/BILL WA',
                           'AMAZON.COM*MT8G19G51 AM PURCHASE AMZN.COM/BILL WA',
                           'AMZ*Stride Rite PURCHASE Customerservi NY',
                           'AMZN MKTP US AMZN.COM/B PURCHASE AMZN.COM/BILL WA',
                           'ARBYS 0154 PURCHASE',
                           'ARCO #42472 AM PURCHASE', 
                           'ARCO #42493 AM PURCHASE',
                           'AUNT CHILADAS PURCHASE'))

df <- df %>%
  #remove everything after a *
  mutate(store_name = gsub("\\*.*","",description),
  #remove everything after a space and a #
         store_name = gsub("\\ #.*","",store_name),
  #remove everything after a space and a number sequence
  store_name = gsub("\\ [0-9].*","",store_name),
  #assign the other Amazon purchases to Amazon
         store_name = ifelse(str_detect(store_name,'AMZ')==TRUE,'AMAZON.COM',store_name))

df_sums <- df %>%
  group_by(store_name) %>%
  summarize(payment_amt = sum(payment_amt)) %>%
  ungroup() %>%
  arrange(payment_amt)

Вот результаты:

# A tibble: 4 x 2
  store_name             payment_amt
  <chr>                        <dbl>
1 AMAZON.COM                  -269. 
2 ARCO                         -60.1
3 AUNT CHILADAS PURCHASE       -16.0
4 ARBYS          -13.9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...