在此先感谢您回答这个问题,由于这是我第一次来,我将接受有关改善我的问题的提示!
我正在将数据从我们的 SQL Server 提取到 r-Notebook 中的数据框中,该数据框附加到接受季度评估的客户身上,此情况自那以后一直在发生2015年第4季度到2018年第2季度。问题是,评估并不总是进行的,因此数据之间存在差距。例如,我目前将创建一个如下所示的数据框:
df <- data.frame(a = c(1:3),
b = c(2:4),
c = c(1:3),
d = c("cow", "moose", "chicken"))
基本上,我需要每个客户名称都有2015年第四季度至2018年第二季度之间每个季度的记录。我将假设尚未进行评估,那么评估价值以前的评估中的默认值。数据框应该最终看起来像这样:
client name | assessment date | assessment value
client 1 | 2015 Q4 | Green
client 1 | 2018 Q1 | Green
client 2 | 2015 Q4 | Yellow
client 2 | 2016 Q2 | Green
client 2 | 2016 Q4 | Green
client 2 | 2017 Q1 | Yellow
谢谢!
答案 0 :(得分:0)
根据@MrFlick的建议,我想试一试,因为我以前没有使用过expand
。
library(tidyr)
library(dplyr)
library(zoo)
df <- data.table::fread("client name | assessment date | assessment value
client 1 | 2015 Q4 | Green
client 1 | 2018 Q1 | Green
client 2 | 2015 Q4 | Yellow
client 2 | 2016 Q2 | Green
client 2 | 2016 Q4 | Green
client 2 | 2017 Q1 | Yellow")
df <- df %>%
mutate(qtr = as.yearqtr(`assessment date`))
df2 <- expand(df, client = `client name`,
qtr = seq(min(qtr), max(qtr), by = 0.25)) %>%
arrange(client, qtr)
df2 %>%
mutate(qtr = as.character(qtr)) %>%
left_join(df %>% mutate(qtr = as.character(qtr)),
by = c('client' = 'client name', 'qtr' = 'qtr')) %>%
group_by(client) %>%
fill(`assessment value`) %>%
select(-`assessment date`)
# A tibble: 20 x 3
# Groups: client [2]
client qtr `assessment value`
<chr> <chr> <chr>
1 client 1 2015 Q4 Green
2 client 1 2016 Q1 Green
3 client 1 2016 Q2 Green
4 client 1 2016 Q3 Green
5 client 1 2016 Q4 Green
6 client 1 2017 Q1 Green
7 client 1 2017 Q2 Green
8 client 1 2017 Q3 Green
9 client 1 2017 Q4 Green
10 client 1 2018 Q1 Green
11 client 2 2015 Q4 Yellow
12 client 2 2016 Q1 Yellow
13 client 2 2016 Q2 Green
14 client 2 2016 Q3 Green
15 client 2 2016 Q4 Green
16 client 2 2017 Q1 Yellow
17 client 2 2017 Q2 Yellow
18 client 2 2017 Q3 Yellow
19 client 2 2017 Q4 Yellow
20 client 2 2018 Q1 Yellow
我不得不摆弄yearqtr
类型并将其转换为character
,以保留加入期间的所有信息。可能有一种更清洁的方法来执行此操作,但希望它可以为您指明正确的方向。