【问题标题】:Efficient Way to Merge Data and Fill NAs with Inconsistent Time Frame合并数据和填充时间框架不一致的 NA 的有效方法
【发布时间】:2018-05-29 05:03:24
【问题描述】:

所以我有两张桌子:

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 值。 我考虑过使用滞后功能,但这会让我在第一年的记录中留下 NA,并且不适用于表 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))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    鉴于您想使用 table_1 中不存在于 table_2 中的一些数据,我认为您不能从 left_join 开始。 您可以从 full_join 开始,然后使用 zoo 包中的 na.locf 获取每个 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
    

    【讨论】:

    • 感谢您的回答!我不知道 zoo::na.locf。我的表是更大的数据集,我想使用 Spark 进行大部分数据操作;我不确定如果我使用 na.locf dplyr/sparklyr 是否会自动翻译该功能:/
    • 我对 sparklyr 不熟悉,所以我不知道你该怎么做。 sparklyr 似乎只支持有限范围的函数 (stackoverflow.com/questions/39494484/sparkr-vs-sparklyr),尽管其中一个 cmets 提到了最新版本中的新 spark_apply() 函数,您可能想看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2015-02-18
    • 2021-12-26
    • 2012-06-24
    • 2021-11-14
    相关资源
    最近更新 更多