R: Весовой параметр в массиве, основанный на других параметрах

У меня есть эта таблица / массив в CSV:

GroupID Channel Daysbeforelast
1 А 35
1           B   31
1 С 29
1 Д 17
1 Е 15
1           D   5
1 С 0
2           B   66
2 Е 17
2           D   15
2 А 2
2 С 0
2           F   0
2 А 0
4           B   15
4 С 0

и пытается добавить еще один столбец Weight поэтому таблица будет выглядеть так:

GroupID Channel Daysbeforelast Вес Как рассчитывается
1           A           35          0,00005         (1-х /2/2-х / 2-х)/2
1           B           31          0,00005         (1-х /2/2-х / 2-х)/2
1           C           29          0,0833          (х /2/2)/3
1           D           17          0,0833          (х /2/2)/3
1           E           15          0,0833          (х /2/2)/3
1           D           5           0,25 (х / 2)
1 С 0 0,5 (х)
2           B           66          0,125           (1-х /2/2-х / 2-х)
2           E           17          0,0625          (х /2/2)/2
2           D           15          0,0625          (х /2/2)/2
2           A           2           0,25 (х /2)
2           C           0           0,25 (х)/3
2           F           0           0,25 (х)/3
2           A           0           0,5 (х)/3
4           B           15          0,5 (1-х)
4 С 0 0,5 (х)

Ниже это объясняется.

Каждая группа может иметь одну или несколько подгрупп в зависимости от данных:

Если Daysbeforelast=0 затем Подгруппа1;

Если 0<Daysbeforelast<=7 затем подгруппа2;

Если 7<Daysbeforelast<=14 затем подгруппа3;

Если 14<Daysbeforelast<=30 затем подгруппа4;

Остальное подгруппа5.

Первая подгруппа имеет weight = x (например, х =0,5). это weight распределяется равномерно по всем строкам в подгруппе в группе. Допустим, группа Y имеет 3 строки в подгруппе Z. В этом случае каждый ряд будет иметь weight equal (SubgroupZ weight)/3,

Подгруппа2 имеет weight = x/2 и он распределяется по всем строкам в этой подгруппе одинаково.

Каждая подгруппа до последней получит weight равно weight предыдущей подгруппы, деленной на 2. Последняя подгруппа в группе (это не всегда подгруппа 5) получит weight = 1 - sum всех предыдущих весов в группе. Это делается для проверки того, что сумма весов для каждой группы равна 1.

Обратите внимание, что если у нас, например, нет строк в Subgroup2, то Subgroup3 получит weight x/2 (не х / 2/2). У нас есть Подгруппа 1 для всех групп, но все или любые другие подгруппы могут отсутствовать.

Самый простой способ сделать это, возможно, использовать переменные lapply, но я получил стек с ним, так как я совсем новичок в R.

Также я думаю, что может быть специализированная библиотека / функция для распределения веса в R?

Спасибо за просмотр моего вопроса.

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"
Другие вопросы по тегам