【问题标题】:Filling empty tibble empty cells on a matching condition of other cells根据其他单元格的匹配条件填充空 tibble 空单元格
【发布时间】:2020-03-02 10:39:12
【问题描述】:

好的。我在下面有一个示例小标题。

在第 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

reprex package (v0.3.0) 于 2020 年 3 月 2 日创建

【问题讨论】:

    标签: r function dataframe dplyr tidyverse


    【解决方案1】:

    您可以使用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 корзины]
    

    【讨论】:

    • 我不需要填写所有缺失值,只要Номер заказа 的值相同
    【解决方案2】:

    如果所有的值都是数字,并且Номер заказаID корзины不同的值没有冲突,一个选择是使用group_by()mutate()来解决这个问题:

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

    这样,所有具有相同Номер заказа 的行将具有相同的ID корзины(作为它们的中位数,以防有多个。)

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2021-03-04
      相关资源
      最近更新 更多