Вставьте новое наблюдение по группе, которая является суммой (или взвешенной суммой) в r

Я все еще плохо знаком с R, и многие вещи все еще трудно выполнить. Сообщество здесь очень помогло! У меня есть еще одна проблема. 1. Создание нового наблюдения для каждой группы, которое будет суммой (или взвешенной суммой) определенных переменных 2. Создание взвешенной суммы для переменной, в которой иногда содержится NA

Мой набор данных:

    df = structure(list(ID = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L), ID_name = c("AA", "AA", "BB", "BB", "CC","CC", "DD","DD","DD"),
    Volume = c(10L, 20L, 30L, 50L, 50L, 40L, 20L, 
    30L, 10L), Score= c(0.1L, 0.3L, 0.5L, NA, 0.6L, NA, 
    0.6L, 0.2L, 0.6L)).Names = c("ID", "ID_name","Volume","Score"), class = "data.frame", row.names = c(NA, -9L))

Я хочу 1. Создать новое наблюдение для каждого уникального идентификатора, то есть ID 1, ID 2, ID 3 и ID 4

2. Пусть эти новые наблюдения будут следующими: ID ID_name Объем Оценка (средневзвешенное значение) 1 AA 30 (то есть 10+20) (10*0,1 + 0,3*20)/(10+20) = 0,23 2 BB 80 (30+50) (30*0,5)/30=0,5 (строка NA игнорируется при вычислении оценки) 3 CC 90 (50+40) (60*0,6)/60=0,6 (строка NA игнорируется при вычислении оценки) 4 DD 60 (20+30+10) (20*0,6+30*0,2+10*0,6) /60 = 0,4

Я попытался изменить функцию, но это не похоже на работу. Любые выводы будут очень признательны. Спасибо

1 ответ

Решение
library(dplyr)

df = data.frame(ID = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L), 
                ID_name = c("AA", "AA", "BB", "BB", "CC", "CC", "DD", "DD", "DD"), 
                Volume = c(10L, 20L, 30L, 50L, 50L, 40L, 20L, 30L, 10L), 
                Score = c(0.1, 0.3, 0.5, NA, 0.6, NA, 0.6, 0.2, 0.6))


df %>%
  mutate(HasScore = ifelse(is.na(Score), 0, 1)) %>%
  group_by(ID, ID_name) %>%
  summarise(WA = sum(Volume*Score, na.rm = T)/sum(Volume*HasScore),
            Volume = sum(Volume)) %>%
  ungroup()

# # A tibble: 4 x 4
#      ID ID_name        WA Volume
#   <int>  <fctr>     <dbl>  <int>
# 1     1      AA 0.2333333     30
# 2     2      BB 0.5000000     80
# 3     3      CC 0.6000000     90
# 4     4      DD 0.4000000     60
Другие вопросы по тегам