给每个缺少的年份(按组)添加缺失的行,并在有条件的情况下,在当前日期的年份之前添加更多的行

时间:2018-07-07 07:22:55

标签: r

我一直在寻找各地的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-给每个组指定最大和最小年份,在缺少的年份中插入行,并将值“ Existing”分配给该年份中的Class变量(我假设解决方案将自动填充Category A和Category每个缺少年份的给定组的B和ID值);

2-如果在给定组的最大年份中该项目被归类为“现有”,而在同一组的最大年份中归类为今天的日期年份,则添加必要的行,直到今天的日期年份并分类该项目为“现有”。

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

如果让我感到困惑的规则说明,请告诉我,以便我有机会为您澄清它们。

在此先感谢您提供的任何帮助。

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

干杯! :)

1 个答案:

答案 0 :(得分:3)

使用的可能解决方案:

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