Базовое решение R, функция findInterval
выполняет основную часть.Затем умножьте результат на df
и получите значение строки.
t1 <- c(1, 2, 4, 6, 7, 9)
t2 <- c(6, 6, 5, 3, 3, 7)
df <- data.frame(t1 = t1, t2=t2, stringsAsFactors = FALSE)
cp <- c(-Inf, 5, 8, Inf)
Edit.
Если весовые коэффициенты нормализованы для суммирования до 1
, топравильный ответ будет любым из следующих двух.
wt <- sapply(df, findInterval, cp)
rowSums(df*(wt/apply(wt, 1, sum)))
#[1] 4.333333 4.666667 4.666667 5.000000 5.666667 8.200000
sapply(1:nrow(df), function(i)
weighted.mean(df[i,], sapply(df, findInterval, cp)[i,]))
#[1] 4.333333 4.666667 4.666667 5.000000 5.666667 8.200000
Эти результаты теперь равны результатам в других ответах.