微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 R 包 dpylr

如何解决使用 R 包 dpylr

这是我的数据

## Data
datex <- c(rep("2021-01-18",61),rep("2021-01-19",125))
hourx <- c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16)
seller <- c("dombsdpapp1","dombsdpapp1","dombsdpapp2","dombsdpapp2")
product <- c("00021460","00021460","00021459","00021460")
detail <- c("E99","E99","notEnoughBalance","success","E99")
status <- c("FI04","FI04","OK01","OK00","FI04")
channel <- c("f2","f2","f3","f2")
transaction <- c(1,25,22,20,18,19,26,21,17,3)
mydata <- data.frame(datex,hourx,seller,product,detail,status,channel,transaction)

我的任务是将中位数添加到组合中。 这就是我的意思。这是一个示例:

  • seller = "dombsdpapp1"
  • product = "00021460"
  • detail = "E99"
  • status = "FI04"
  • channel = "f2"
combination1 <- mydata[(mydata$seller == "dombsdpapp1" & mydata$product == "00021460" & mydata$detail == "E99" & mydata$status == "FI04" & mydata$channel == "f2"),]

combination1
# datex hourx      seller  product detail status channel transaction
# 1   2021-01-18     0 dombsdpapp1 00021460    E99   FI04      f2           1
# 2   2021-01-18     1 dombsdpapp1 00021460    E99   FI04      f2           6
# 3   2021-01-18     2 dombsdpapp1 00021460    E99   FI04      f2           2
# 5   2021-01-18     3 dombsdpapp1 00021460    E99   FI04      f2           1
# 7   2021-01-18     4 dombsdpapp1 00021460    E99   FI04      f2           1
# 9   2021-01-18     5 dombsdpapp1 00021460    E99   FI04      f2           6
# 11  2021-01-18     6 dombsdpapp1 00021460    E99   FI04      f2           5
# 13  2021-01-18     7 dombsdpapp1 00021460    E99   FI04      f2          14
# 14  2021-01-18     8 dombsdpapp1 00021460    E99   FI04      f2           6
# 16  2021-01-18     9 dombsdpapp1 00021460    E99   FI04      f2           9
# 18  2021-01-18    10 dombsdpapp1 00021460    E99   FI04      f2          14
# 20  2021-01-18    11 dombsdpapp1 00021460    E99   FI04      f2          12
# 22  2021-01-18    12 dombsdpapp1 00021460    E99   FI04      f2          12
# 25  2021-01-18    13 dombsdpapp1 00021460    E99   FI04      f2           9
# 27  2021-01-18    14 dombsdpapp1 00021460    E99   FI04      f2           3
# 28  2021-01-18    15 dombsdpapp1 00021460    E99   FI04      f2           3
# 29  2021-01-18    16 dombsdpapp1 00021460    E99   FI04      f2           4
# 71  2021-01-19     1 dombsdpapp1 00021460    E99   FI04      f2           4
# 77  2021-01-19     2 dombsdpapp1 00021460    E99   FI04      f2           3
# 85  2021-01-19     3 dombsdpapp1 00021460    E99   FI04      f2           2
# 90  2021-01-19     4 dombsdpapp1 00021460    E99   FI04      f2           1
# 97  2021-01-19     5 dombsdpapp1 00021460    E99   FI04      f2           3
# 104 2021-01-19     6 dombsdpapp1 00021460    E99   FI04      f2           8
# 112 2021-01-19     7 dombsdpapp1 00021460    E99   FI04      f2          11
# 120 2021-01-19     8 dombsdpapp1 00021460    E99   FI04      f2           7
# 130 2021-01-19     9 dombsdpapp1 00021460    E99   FI04      f2           4
# 139 2021-01-19    10 dombsdpapp1 00021460    E99   FI04      f2          13
# 145 2021-01-19    11 dombsdpapp1 00021460    E99   FI04      f2          16
# 156 2021-01-19    12 dombsdpapp1 00021460    E99   FI04      f2           8
# 164 2021-01-19    13 dombsdpapp1 00021460    E99   FI04      f2           5
# 173 2021-01-19    14 dombsdpapp1 00021460    E99   FI04      f2           8
# 179 2021-01-19    15 dombsdpapp1 00021460    E99   FI04      f2           8
# 183 2021-01-19    16 dombsdpapp1 00021460    E99   FI04      f2           1

从结果中我们可以看到 datex "2021-01-18" 和 "2021-01-19" 错过了hourx 从17 到23,所以我们需要将combination1 的中位数加入hourx 17-23。我像这样手动操作

## Add Median into combination1
add_datex1 <- rep("2021-01-18",7); add_datex2 <- rep("2021-01-19",7); add_hourx <- 17:23; add_seller <- rep("dombsdpapp1",7); add_product <- rep("00021460",7); add_detail <- rep("E99",7); add_status <- rep("FI04",7); add_channel <- rep("f2",7); add_transaction <- rep(median(combination1$transaction),7)
add_18 <- data.frame(add_datex1,add_hourx,add_seller,add_product,add_detail,add_status,add_channel,add_transaction)
colnames(add_18) <- colnames(mydata)
add_19 <- data.frame(add_datex2,add_transaction)
colnames(add_19) <- colnames(mydata)
new_combination1 <- rbind(combination1[1:17,],add_18,combination1[-(1:17),add_19)
rownames(new_combination1) <- 1:47
new_combination1
        datex hourx      seller  product detail status channel transaction
#1  2021-01-18     0 dombsdpapp1 00021460    E99   FI04      f2           1
#2  2021-01-18     1 dombsdpapp1 00021460    E99   FI04      f2           6
#3  2021-01-18     2 dombsdpapp1 00021460    E99   FI04      f2           2
#4  2021-01-18     3 dombsdpapp1 00021460    E99   FI04      f2           1
#5  2021-01-18     4 dombsdpapp1 00021460    E99   FI04      f2           1
#6  2021-01-18     5 dombsdpapp1 00021460    E99   FI04      f2           6
#7  2021-01-18     6 dombsdpapp1 00021460    E99   FI04      f2           5
#8  2021-01-18     7 dombsdpapp1 00021460    E99   FI04      f2          14
#9  2021-01-18     8 dombsdpapp1 00021460    E99   FI04      f2           6
#10 2021-01-18     9 dombsdpapp1 00021460    E99   FI04      f2           9
#11 2021-01-18    10 dombsdpapp1 00021460    E99   FI04      f2          14
#12 2021-01-18    11 dombsdpapp1 00021460    E99   FI04      f2          12
#13 2021-01-18    12 dombsdpapp1 00021460    E99   FI04      f2          12
#14 2021-01-18    13 dombsdpapp1 00021460    E99   FI04      f2           9
#15 2021-01-18    14 dombsdpapp1 00021460    E99   FI04      f2           3
#16 2021-01-18    15 dombsdpapp1 00021460    E99   FI04      f2           3
#17 2021-01-18    16 dombsdpapp1 00021460    E99   FI04      f2           4
#18 2021-01-18    17 dombsdpapp1 00021460    E99   FI04      f2           6
#19 2021-01-18    18 dombsdpapp1 00021460    E99   FI04      f2           6
#20 2021-01-18    19 dombsdpapp1 00021460    E99   FI04      f2           6
#21 2021-01-18    20 dombsdpapp1 00021460    E99   FI04      f2           6
#22 2021-01-18    21 dombsdpapp1 00021460    E99   FI04      f2           6
#23 2021-01-18    22 dombsdpapp1 00021460    E99   FI04      f2           6
#24 2021-01-18    23 dombsdpapp1 00021460    E99   FI04      f2           6
#25 2021-01-19     1 dombsdpapp1 00021460    E99   FI04      f2           4
#26 2021-01-19     2 dombsdpapp1 00021460    E99   FI04      f2           3
#27 2021-01-19     3 dombsdpapp1 00021460    E99   FI04      f2           2
#28 2021-01-19     4 dombsdpapp1 00021460    E99   FI04      f2           1
#29 2021-01-19     5 dombsdpapp1 00021460    E99   FI04      f2           3
#30 2021-01-19     6 dombsdpapp1 00021460    E99   FI04      f2           8
#31 2021-01-19     7 dombsdpapp1 00021460    E99   FI04      f2          11
#32 2021-01-19     8 dombsdpapp1 00021460    E99   FI04      f2           7
#33 2021-01-19     9 dombsdpapp1 00021460    E99   FI04      f2           4
#34 2021-01-19    10 dombsdpapp1 00021460    E99   FI04      f2          13
#35 2021-01-19    11 dombsdpapp1 00021460    E99   FI04      f2          16
#36 2021-01-19    12 dombsdpapp1 00021460    E99   FI04      f2           8
#37 2021-01-19    13 dombsdpapp1 00021460    E99   FI04      f2           5
#38 2021-01-19    14 dombsdpapp1 00021460    E99   FI04      f2           8
#39 2021-01-19    15 dombsdpapp1 00021460    E99   FI04      f2           8
#40 2021-01-19    16 dombsdpapp1 00021460    E99   FI04      f2           1
#41 2021-01-19    17 dombsdpapp1 00021460    E99   FI04      f2           6
#42 2021-01-19    18 dombsdpapp1 00021460    E99   FI04      f2           6
#43 2021-01-19    19 dombsdpapp1 00021460    E99   FI04      f2           6
#44 2021-01-19    20 dombsdpapp1 00021460    E99   FI04      f2           6
#45 2021-01-19    21 dombsdpapp1 00021460    E99   FI04      f2           6
#46 2021-01-19    22 dombsdpapp1 00021460    E99   FI04      f2           6
#47 2021-01-19    23 dombsdpapp1 00021460    E99   FI04      f2           6

如何使用 dplyr 将所有组合自动添加到缺失的“hourx”中? 非常感谢。

解决方法

创建函数来完成 hourx 并用 median 填充它:

fillHour <- function(df){
  
  data.frame(
    hourx = 0:23
  ) %>%
    left_join(df,by = "hourx") %>%
    replace_na(list(transaction = median(.[["transaction"]],na.rm = TRUE)))
}

nest 数据框并在 fillHour 上使用 data

mydata %>% 
  group_by(datex,seller,product,detail,status,channel) %>% 
  nest() %>% 
  mutate(data = map(data,fillHour)) %>% 
  unnest(cols = "data") %>% 
  ungroup()
,

您需要 NA imputationcomplete。建议采用以下策略-

  • group_by 一次对所有所需的分组变量进行分组(因为在进行 NA 插补时无论如何您都需要这些)
  • 使用 tidyr::complete 为每个组完成 0:23 的小时序列。
  • 最后使用 coalesce 进行 NA 插补

library(tidyverse)

mydata %>% group_by(datex,channel) %>%
  complete(hourx = 0:23) %>%
  mutate(transaction = coalesce(transaction,median(transaction,na.rm = T)))
# A tibble: 408 x 8
# Groups:   datex,channel [17]
   datex      seller      product  detail status channel hourx transaction
   <chr>      <chr>       <chr>    <chr>  <chr>  <chr>   <dbl>       <dbl>
 1 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          0          12
 2 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          1          12
 3 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          2          12
 4 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          3           5
 5 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          4           2
 6 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          5           9
 7 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          6          12
 8 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          7          25
 9 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          8          22
10 2021-01-18 dombsdpapp1 00021459 E99    FI04   f3          9          10
# ... with 398 more rows

reprex package (v2.0.0) 于 2021 年 5 月 18 日创建

,

这是一种使用 dplyr 来确定每个组的中位数的方法,然后 lubridate 将日期和小时组合到一个字段中,并使用 padr 填充所有缺失的小时行,最后使用 join & 合并来添加中位数那些缺失的行。

library(padr); library(dplyr); library(lubridate)
medians <- mydata %>%
  group_by(seller,channel) %>%
  summarise(median = median(transaction),.groups = "drop") 

mydata %>%
  mutate(timestamp =  lubridate::ymd_h(paste(datex,hourx))) %>%
  padr::pad(by = "timestamp",group = c("seller","product","detail","status","channel")) %>%
  left_join(medians) %>%
  mutate(filled_transaction = coalesce(transaction,median))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。