【问题标题】:Weight parameter in array based on other parameters基于其他参数的数组中的权重参数
【发布时间】: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 很陌生。

【问题讨论】:

    标签: r lapply sapply


    【解决方案1】:

    解决方案如下:对于每个组,使用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"
    

    【讨论】:

    • 非常感谢@Omley!它工作得很好,这是一个很好的解决方案。我也更正了“如何计算权重”列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2018-08-24
    • 2023-02-22
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多