【发布时间】:2019-09-24 13:07:18
【问题描述】:
我已经导入了一个表格(Table1),格式如下:
ID Name Age Start Status1 Status2 Status3 Status4 Status5 Status6
01 John 45 2011 25 13 13 12 34 35
02 Mike 23 2017 12 15 18 45 32 25
03 Peter 34 2019 34 12 15 19 24 27
04 Sarah 21 2020 45 46 47 48 49 50
我已经生成了另一个表格(Table2),如下所示:
ID Name Age Start Year Value
02 Mike 23 2017 3 24
03 Peter 34 2019 1 11
03 Peter 34 2019 2 13
03 Peter 34 2019 3 13
04 Sarah 21 2020 1 42
04 Sarah 21 2020 2 43
04 Sarah 21 2020 3 44
表 2 包含开始后前 3 年的预测值(包括开始),但仅在尚未过去三年的情况下(如当年,2019 年)。所以在上面的例子中,ID 01 已经超过了它们的起始值 3 年以上,所以没有预测; ID 02 比他们的 Start 值晚了两年,所以有一个预测; ID 03 和 04 的起始值为零年,因此有三个预测。
我需要将 Table2 中的 Values 转换为 Table1,替换 Status 值并将它们向右移动。决赛桌应如下所示:
ID Name Age Start Status1 Status2 Status3 Status4 Status5 Status6
01 John 45 2011 25 13 13 12 34 35
02 Mike 23 2017 24 12 15 18 45 32
03 Peter 34 2019 11 13 13 34 12 15
04 Sarah 21 2020 42 43 44 45 46 47
如您所见,ID 01 的行保持不变。对于 ID 02,旧的 Status 值向右移动了一位,并且 Status1 已被替换。对于 ID 03 和 04,旧的 Status 值向右移动了三位,并且 Status1 到 Status3 已被替换。如您所见,Status4 到 Status6 中的旧值已被删除。
我非常坚持这一点。到目前为止,我已尝试围绕替换制定一些规则,如下所示:
1) 如果 Year 距离当前年份 (2019) 超过 3 年,则保留 Status 列名称不变。例如表 1 的第 1 行。
2) 如果 Start 为 2019 或更高版本,则通过添加 3 重命名 Status 列。例如,在 Table1 的第 3 和 4 行中,应将 Status1 重命名为 Status4,依此类推。最后 3 个状态列(状态 4 到状态 6)将被删除。
3) 如果 Start 在 2019 年的 3 年内(即 2017 到 2019),则通过添加 2016 和 Start 之间的差异来重命名 Status 列。例如在 Table1 的第 2 行中,Status1 将被重命名为 Status2,依此类推。最后一列 (Status6) 将被删除。
我可以使用 if / else 对这些进行编码,但我不确定如何使用 select() 和 left_join() 将它们放入数据争吵管道中以成功执行这些更改。我正在使用 R,但如果它更容易,也可以使用 SQL。任何帮助将不胜感激。
附言我很欣赏生成的表格是一种奇怪的格式,但不幸的是这是我需要生成的。
【问题讨论】:
-
Mike 的新 Status1 中的 11 是从哪里来的?
-
@IceCreamToucan 抱歉,这是一个错字 - 我现在对其进行了编辑以修复它。
标签: r dplyr data.table purrr