数组中基于其他参数的权重参数

Weight parameter in array based on other parameters

我在 CSV 中得到了这个 table/array:

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 因此 table 将如下所示:

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则子组1;

如果 0<Daysbeforelast<=7 那么子组 2;

如果 7<Daysbeforelast<=14 那么子组 3;

如果14<Daysbeforelast<=30则子组4;

其他子组 5.

第一个子组有 weight = x(例如 x=0.5)。此 weight 均匀分布在组中子组的所有行中。假设 Y 组在 SubgroupZ 中有 3 行。在这种情况下,每一行将有 weight equal (SubgroupZ weight)/3.

子组 2 有 weight = x/2,它以相同的方式分布在该子组的所有行中。

直到最后一个子组的每个子组将收到 weight 等于前一个子组的 weight 除以 2。

组中的最后一个子组(并不总是子组 5)将收到组中所有先前权重的 weight = 1 - sum

这是为了检查每组的权重总和是否等于 1。

请注意,如果我们在 Subgroup2 中没有任何行,那么 Subgroup3 将收到 weight x/2(而不是 x/2/2)。

我们有所有组的 Subgroup1,但所有或任何其他子组都可能缺失。

执行此操作的最简单方法可能是使用变量 lapply,但由于我是 R 的新手,所以我得到了堆栈。

解决方案如下:对于每个组,使用 cut 确定子组并使用 droplevels 删除缺席子组。分配权重为 (x/2^n)/freq。然后确定最小权重并调整它们,使一组中的权重总和为 1。

dat <- read.table("clipboard", header = T)
groupIDs <- unique(dat$GroupID)
x = 0.5
for (i in groupIDs)
{
  rows = which(dat$GroupID == i)
  Subgroups <- cut(dat[rows,3], c(-Inf,0,7,14,30,Inf), labels = 1:5)
  a<-droplevels(Subgroups)
  wts <- sapply(a,function(y)(x/(2^(as.numeric(y)-1)))/(table(a)[which(levels(a) == y)]))

  ind <- wts==min(wts)
  wts[ind] <- (1-sum(wts[!ind]))/sum(ind)
  dat[rows,4] <- wts    
}
names(dat)[4] <- "Weight"