【问题标题】:Add missing rows per missing Year by Group AND add more rows till present date year given a condition按组添加每个缺失年份的缺失行并在给定条件下添加更多行直到当前日期年份
【发布时间】:2018-07-07 07:22:54
【问题描述】:

我一直在搜索 SO 以及其他数据科学和编程博客,但没有找到满足我特定需求的答案。因此,如果您发现此问题重复,请善意并指出信息来源并关闭/删除此问题。

我的真实数据将有数千行,所以我在这里只显示一小部分虚构数据,与我的原始数据非常相似:

Data <- data.frame(CategoryA =c("Xpto1","Xpto1","Xpto1","Xpto1","Xpto2","Xpto2","Xpto2","Xpto1","Xpto1", "Xpto3", "Xpto3", "Xpto3", "Xpto3", "Xpto3", "Xpto3"),CategoryB = c("Type1","Type1","Type1","Type1","Type1","Type1","Type1","Type2","Type2", "Type1", "Type1", "Type1", "Type1", "Type1", "Type1"),ID = c(1,1,1,1,2,2,2,3,3,4,4,4,4,4,4),Year =c(2014,2015,2016,2017,2007,2009,2010,2014,2016, 1997,2002,2010,2012,2013,2015),Class = c("New","Existing", "Existing", "Lost","New", "Existing", "Existing", "New", "Existing","New", "Lost", "Out","Recovered", "Existing", "Existing"))

我会发布数据框,但我不知道如何在 SO 中正确执行,尽管我已阅读有关可重现示例的正确线程:How to make a great R reproducible example?

到目前为止我最好的尝试如下:

Data %>% 
group_by(CategoryA, CategoryB, ID) %>% 
complete(nesting(CategoryA, CategoryB, ID), Year = seq.int( min(Year), max(Year) ) ) %>%
arrange( ID, Year )

但是,这种方法有两个问题:

1 - 它只在每组的最小和最大年份之间的缺失年份中添加行;

2 - 在实际数据中使用这种方法时,由于数据集包含大约 200K 的观测值,因此过程非常缓慢(R 大约需要 2 或 3 分钟才能完成手头的任务)。

手头问题的解释,以及行分配规则:

给定项目 ID、年份、类别 A 和类别 B 变量的列表,以如下方式在数据集中添加行:

1 - 给定每个组的最大和最小年份,在缺失年份插入行并将值“现有”分配给该缺失年份的 Class 变量(我假设解决方案将自动填充类别 A 和类别缺少年份的每个给定组的 B 和 ID 值);

2 - 如果在给定组的最大年份中,该项目被归类为“现有”,并且如果低于今天的日期年份,则同一组的最大年份,然后根据需要添加尽可能多的行,直到今天的日期年份并分类该项目为“现有”。

请注意:我将组定义为变量的组合:CategoryA、categoryB 和 ID

如果您发现我的规则解释令人困惑,请告诉我,以便我有机会为您澄清。

提前感谢您提供的任何帮助。

编辑:我更新了数据集以更好地反映真实数据。

干杯! :)

【问题讨论】:

    标签: r


    【解决方案1】:

    使用的可能解决方案:

    library(data.table)
    setDT(Data)[, .SD[CJ(Year = seq(min(Year), ifelse(Class[which.max(Year)] == "Existing",
                                                      year(Sys.Date()), max(Year))))
                      , on = .(Year)]
                , by = .(ID, CategoryA, CategoryB)
                ][is.na(Class), Class := "Existing"][]
    

    给出:

        ID CategoryA CategoryB Year    Class
     1:  1     Xpto1     Type1 2014      New
     2:  1     Xpto1     Type1 2015 Existing
     3:  1     Xpto1     Type1 2016 Existing
     4:  1     Xpto1     Type1 2017     Lost
     5:  2     Xpto2     Type1 2007      New
     6:  2     Xpto2     Type1 2008 Existing
     7:  2     Xpto2     Type1 2009 Existing
     8:  2     Xpto2     Type1 2010 Existing
     9:  2     Xpto2     Type1 2011 Existing
    10:  2     Xpto2     Type1 2012 Existing
    11:  2     Xpto2     Type1 2013 Existing
    12:  2     Xpto2     Type1 2014 Existing
    13:  2     Xpto2     Type1 2015 Existing
    14:  2     Xpto2     Type1 2016 Existing
    15:  2     Xpto2     Type1 2017 Existing
    16:  2     Xpto2     Type1 2018 Existing
    17:  3     Xpto1     Type2 2014      New
    18:  3     Xpto1     Type2 2015 Existing
    19:  3     Xpto1     Type2 2016 Existing
    20:  3     Xpto1     Type2 2017 Existing
    21:  3     Xpto1     Type2 2018 Existing
    

    【讨论】:

    • 您的代码运行良好。但是,我未能提供更准确地反映我的真实数据的适当数据集。我编辑了我的问题。请您再试一次,使用您的代码以适应新场景,好吗?谢谢!
    • @zStrike 据我所知,代码正在做你想做的事。如果不是,你能描述一下输出有什么问题吗?如果您包含所需的输出,那将非常有帮助。
    • 感谢您抽出时间重新审视这个问题,很抱歉我没有早点回答,但随着周末的到来,家人又来了:)。无论如何,如果您在我昨天编辑的新数据集上使用您的代码,您会注意到对于 ID 为 4 的项目,在 2002 年和 2010 年之间,该项目在 2002 年和 2010 年丢失,这意味着该项目是这些年份之间不存在,因此代码不应在 2002 年和 20012 年(该项目恢复的年份)之间添加年份,我应该在规则要求中发布,对此我很抱歉。
    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 2017-10-03
    • 1970-01-01
    • 2020-11-11
    • 2022-12-30
    • 2021-12-31
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多