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 中正确执行,尽管我已经阅读了有关可重现示例的正确线程:如何制作一个出色的 R 可重现示例?
到目前为止,我最好的尝试如下:
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
如果您发现我的规则解释令人困惑,请告诉我,以便我有机会为您澄清它们。
提前感谢您,您可以提供任何帮助。
编辑:我更新了数据集以更好地反映真实数据。
干杯! :)
解决方案
使用data.table的可能解决方案:
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
推荐阅读
- php - 为什么 xdebug.so 在 no-debug-non-zts 中不存在?
- android - 列表视图内容删除查询使应用程序崩溃
- javascript - 是否可以在另一个 axios 响应中使用 axios 发布请求?
- c - 嵌套包装函数
- sql - 将结果放入一组 2 或我指定的任何数字
- neo4j - 如何通过过滤(Neo4j,Cypher)通过多种关系类型匹配所有可能的路径
- rest - 在 REST GET 请求中传递大量数据
- mysql - 为什么我不能在 MySQL 中使用 FAST_FORWARD 数据库游标?
- javascript - 使用 `.every` 数组方法如何编写一个函数来确定数组中的每个数字是否都是平方数?
- swift - 等待布尔值“真”的更优雅的方式