合并数据的有效方法和填充不一致时间框架的NA

时间:2017-12-15 01:42:58

标签: r dplyr

所以我有两张桌子:

Table1: 
ID  Yr     Qty  Cum_Qty
A   2013    3   3
A   2015    3   6
A   2016    2   8
B   2006    1   1  

Table2:
ID  Yr  
A   2013    
A   2014    
A   2015    
A   2016    
A   2017
B   2016    
B   2017    
C   2016
C   2017

这就是我想要实现的目标 - 我想将Cum_Qty添加到表2并继承最新的Cum_Qty(如果存在):

ID  Yr  Cum_Qty
A   2013    3
A   2014    3
A   2015    6
A   2016    8
A   2017    8   
B   2016    1
B   2017    1
C   2016    0
C   2017    0

如果我目前执行left_join(table2, table1, by = c("ID", "Yr"),如果表2中缺少特定年份,我最终会在Cum_Qty中使用NA值。 我考虑过使用滞后函数,但是这会让我在第一年的记录中使用NAs,并且不会对于表1中缺少的ID C起作用。 我想使用dplyr::mutate所以我的代码保留在管道中。

我想我知道如何用3~4个变异做到这一点,但我想找到一种简化代码的方法。有没有人对我能做什么有任何建议?

在R中创建表:

table_1 <- data.frame(
    ID = c("A", "A", "A", "B"), 
    Yr = c(2013, 2015, 2016, 2006),
    Qty = c(3, 3, 2, 1)) %>%
    arrange(ID, Yr) %>%
    group_by(ID) %>%
    mutate(Cum_Qty = cumsum(Qty))

table_2 <- data.frame(
    ID = c("A", "A", "A", "A", "A", "B", "B", "C", "C"),
    Yr = c(2013, 2014, 2015, 2016, 2017, 2016, 2017, 2016, 2017))

1 个答案:

答案 0 :(得分:1)

鉴于您想要使用table_1中不存在于table_2中的某些数据,我认为您不能从left_join开始。 您可以从full_join开始,然后使用na.locf包中的zoo获取每个ID组的最后一个非NA值,然后再执行inner_join最后的table_2中的行:

library(dplyr)
library(zoo)
full_join(table_2,table_1,by=c("ID","Yr")) %>% 
group_by(ID) %>%
arrange(ID,Yr) %>%
mutate(Cum_Qty = na.locf(Cum_Qty,na.rm=F)) %>%
mutate(Cum_Qty = ifelse(is.na(Cum_Qty),0,Cum_Qty)) %>%
select(-Qty) %>%
inner_join(table_2)

# A tibble: 9 x 3
# Groups:   ID [?]
     ID    Yr Cum_Qty
  <chr> <dbl>   <dbl>
1     A  2013       3
2     A  2014       3
3     A  2015       6
4     A  2016       8
5     A  2017       8
6     B  2016       1
7     B  2017       1
8     C  2016       0
9     C  2017       0