【发布时间】:2015-08-07 16:07:41
【问题描述】:
我在 CSV 中有这个表/数组:
GroupID Channel Daysbeforelast
1 A 35
1 B 31
1 C 29
1 D 17
1 E 15
1 D 5
1 C 0
2 B 66
2 E 17
2 D 15
2 A 2
2 C 0
2 F 0
2 A 0
4 B 15
4 C 0
并尝试再添加一列Weight,以便表格如下所示:
GroupID Channel Daysbeforelast Weight How it is calculated
1 A 35 0.00005 (1-x/2/2-x/2-x)/2
1 B 31 0.00005 (1-x/2/2-x/2-x)/2
1 C 29 0.0833 (x/2/2)/3
1 D 17 0.0833 (x/2/2)/3
1 E 15 0.0833 (x/2/2)/3
1 D 5 0.25 (x/2)
1 C 0 0.5 (x)
2 B 66 0.125 (1-x/2/2-x/2-x)
2 E 17 0.0625 (x/2/2)/2
2 D 15 0.0625 (x/2/2)/2
2 A 2 0.25 (x/2)
2 C 0 0.25 (x)/3
2 F 0 0.25 (x)/3
2 A 0 0.5 (x)/3
4 B 15 0.5 (1-x)
4 C 0 0.5 (x)
下面解释:
每个组可以有一个或多个子组,具体取决于数据:
如果Daysbeforelast=0 则为 Subgroup1;
如果0<Daysbeforelast<=7 则子组2;
如果7<Daysbeforelast<=14 则为 Subgroup3;
如果14<Daysbeforelast<=30 则为 Subgroup4;
其他子组 5。
第一个子组有 weight = x(例如 x=0.5)。此weight 均匀分布在组中子组的所有行中。假设 Y 组在 SubgroupZ 中有 3 行。在这种情况下,每一行都有weight equal (SubgroupZ weight)/3。
Subgroup2 有 weight = x/2,它以相同的方式分布在该子组中的所有行中。
直到最后一个子组的每个子组都将收到等于前一个子组的weight 除以 2 的weight。
组中的最后一个子组(并不总是第 5 个子组)将收到组中所有先前权重的weight = 1 - sum。
这是为了检查每个组的权重之和是否等于 1。
请注意,如果我们在 Subgroup2 中没有任何行,那么 Subgroup3 将收到 weight x/2(不是 x/2/2)。
我们有所有组的 Subgroup1,但所有或任何其他子组都可能丢失。
最简单的方法可能是使用变量 lapply 但我对它很陌生,因为我对 R 很陌生。
【问题讨论】: