Просто переместите объявления переменных (Node<T> current
, int currentIndex
) за пределы цикла, и он должен работать. Что-то вроде этого
int currentIndex;
Node<T> current;
for (current = first; current != null; current = current.next, currentIndex++) {
или, может быть, даже
int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {
Решение с использованием tidyverse
для вычисления взвешенного среднего для каждой строки.
library(tidyverse)
df2 <- df %>%
# Add row numbers
rowid_to_column() %>%
# Convert to long format
gather(Group, Value, -rowid) %>%
# Assign weight
mutate(Weight = case_when(
Value <= 5 ~1,
Value > 5 & Value <= 8 ~2,
Value > 8 ~3,
TRUE ~NA_real_
)) %>%
# Calculated weighted average
group_by(rowid) %>%
summarize(Weighted_Mean = weighted.mean(Value, Weight)) %>%
ungroup()
df2
# rowid Weighted_Mean
# <int> <dbl>
# 1 1 4.33
# 2 2 4.67
# 3 3 4.5
# 4 4 5
# 5 5 5.67
# 6 6 8.2
Если вы хотите умножить на вес & amp; затем разделите их на сумму (равную weighted.mean
функции в R):
df %>%
mutate_at(vars(t1, t2),
list(weights = ~ case_when(. <= 5 ~ 1,
. > 5 & . <= 8 ~ 2,
TRUE ~ 3))) %>%
mutate(rowMeanWeighted = rowSums(.[, 1:2] * .[, 3:4]) / rowSums(.[, 3:4])) %>%
select(-contains("weights"))
Выход:
t1 t2 rowMeanWeighted
1 1 6 4.333333
2 2 6 4.666667
3 4 5 4.500000
4 6 3 5.000000
5 7 3 5.666667
6 9 7 8.200000
Основное решение 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)
Редактировать.
Если веса нормированы на сумму 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
Эти результаты теперь равны результатам в других ответах.