数组中基于其他参数的权重参数
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"
我在 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"