Как использовать условие со строками в кадре данных (средневзвешенное значение, язык R)?

Просто переместите объявления переменных (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++) {
1
задан www 3 March 2019 в 16:25
поделиться

3 ответа

Решение с использованием 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 
0
ответ дан www 3 March 2019 в 16:25
поделиться

Если вы хотите умножить на вес & 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
0
ответ дан arg0naut91 3 March 2019 в 16:25
поделиться

Основное решение 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

Эти результаты теперь равны результатам в других ответах.

0
ответ дан Rui Barradas 3 March 2019 в 16:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: