如何解决使用 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 imputation
和 complete
。建议采用以下策略-
- 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 举报,一经查实,本站将立刻删除。