Заполнение пустых пустых ячеек таблицы при условии совпадения других ячеек - PullRequest
0 голосов
/ 02 марта 2020

Хорошо. У меня есть пример тиббла ниже.

В строках # 9, 10, 11 мы имеем одинаковые Номер заказа. Мне нужно установить одинаковое значение ID корзины для всех трех, как в первом случае - «141330». Я пробовал case_when и if_else, но, похоже, мне нужно написать здесь функцию ...

library(data.table)
library(tidyverse)

orders <- fread("~/Downloads/orders.csv", select = c("id", "Номер заказа", "Статус", "ID корзины", "ФР", "Сумма"),
                colClasses = list(character = c("id", "Номер заказа", "Статус", "ID корзины"),
                                  numeric = c("ФР", "Сумма")), dec = ",")


orders1 <- orders %>% 
  mutate(`Номер заказа` = stringr::str_remove(`Номер заказа`, ".*Р-")) %>%
  group_by(id, `Номер заказа`, Статус) %>%
  summarise(`ID корзины`, ФР = sum(ФР, na.rm = T), Сумма = sum(Сумма, na.rm = T))

orders1
#> # A tibble: 12 x 6
#> # Groups:   id, Номер заказа [12]
#>    id    `Номер заказа` Статус                          `ID корзины`    ФР Сумма
#>    <chr> <chr>          <chr>                           <chr>        <dbl> <dbl>
#>  1 11061 180618-11061   Отменен                         "66843"       66.0   218
#>  2 20752 260219-20752   Отменен                         "98537"        0     928
#>  3 24450 040619-24450   Отменен                         "108330"       0     -51
#>  4 24552 060619-24552   Отменен                         "108516"     -53.8   -22
#>  5 33064 241219-33064   Отменен                         "134157"       0     260
#>  6 35137 070220-35137   Доставлен                       ""           492.   1520
#>  7 36117 290220-36117   Передан на склад                "141275"       0     326
#>  8 36142 290220-36142   Передан на склад                "138181"       0     999
#>  9 36147 010320-36147   Передан на склад                "141330"       0    1025
#> 10 36155 010320-36147   Передан на отгрузку (отправлен… ""             0     335
#> 11 36157 010320-36147   Передан на отгрузку (отправлен… ""             0     592
#> 12 4548  4361           Доставлен                       "41096"      472.   1678

Создано в 2020-03-02 пакетом prex (v0. 3,0)

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Если все значения являются числами, и нет конфликта значений с одинаковыми Номер заказа и разными ID корзины, одним из вариантов является использование group_by() и mutate() для решения этой проблемы:

 orders2 <- orders1 %>% group_by(`Номер заказа`) %>%
            mutate(`ID корзины` = median( `ID корзины`, na.rm = T)) %>%
            ungroup()

Таким образом, все строки с одинаковым Номер заказа будут иметь одинаковые ID корзины (как их медиана, если их несколько).

0 голосов
/ 02 марта 2020

Вы можете заполнить последние значения в пропущенных строках, используя пакет zoo.

Вот пример.

a <- c(1,2,"","",3,"","")

> a
[1] "1" "2" ""  ""  "3" ""  "" 

a[a==""] <- NA

> a
[1] "1" "2" NA  NA  "3" NA  NA

library(zoo)

na.locf(a)
[1] "1" "2" "2" "2" "3" "3" "3"

Это может заполнить значения в соответствии с последними значениями, отличными от NA. Возможно, вы можете позвонить своему ID корзины и выполнить то же самое.

В вашем случае,

library(zoo)
orders1$ID корзины[orders1$ID корзины==""] <- NA

orders1$ID корзины <- na.locf[orders1$ID корзины]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...