Я пытаюсь получить взвешенную сумму по уровням факторов. У меня четыре столбца данных:
col1 = surface area
col 2 = dominant
col 3 = codominant
col 4 = sub
1 2 3 4
125 A NA NA
130 A NA B
150 C B NA
160 B NA NA
90 B A NA
180 C A B
- Если заполнен только столбец 2, значение получает полный объем столбца 1.
- Если столбцы 2 и 3 заполнены, значение в столбце 1 делится пополам.
- Если столбцы 2, 3 и 4 заполнены, значение в столбце 1 разделяется на три.
- Если столбцы 2 и 4 заполнены, значение в столбце 1 делится как 75/25.
Итак, для вывода приведенного выше примера мой новый фрейм данных будет:
1 2
A 326.9
B 331.4
C 134.4
Я возился с ifelse
и получил что-то вроде (для двух столбцов в этом примере):
df1 <- df %>%
mutate(weighted_dominant = ifelse(!is.na(dominant) & is.na(codominant), Surface_Area,
Surface_Area/2),
weighted_codominant = ifelse(!is.na(codominant), Surface_Area/2, NA )
Теперь я изолирую столбцы интересета:
df2 <- df1 %>% select(dominant, weighted_dominant) %>%
group by (dominant) %>%
summarise (sum = sum(weighted_dominant)
также выполните это для кодоминантного столбца, свяжите строки двух новых фреймов данных и снова выполните функцию суммирования.
Это выполняет свою работу, но также требует около 50 строк кода и, на мой взгляд, не очень чисто.
Мой вопрос: есть ли лучшие (tidyverse) способы сделать такое взвешенное обобщение?