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"