#r #machine-learning #mean #summary
#r #машинное обучение #среднее #Краткие сведения
Вопрос:
У меня есть два набора данных, с которыми я работаю. Первый набор данных представляет собой набор отдельных образцов, с которых я проводил измерения, а другой — набор зарегистрированных средних измерений для данной популяции вида в предыдущих исследованиях. Первый набор данных выглядит следующим образом:
data.frame(Species = c('Species1', "Species1", 'Species1', 'Species2', 'Species3', 'Species3'),
Specimen = c('A1', 'B2', 'C3', 'D4', 'E5', 'F6'),
Measurement1 = c(100, 110, 120, 130, 140,150),
Measurement2 = c(1, 2, 3, 4, 5, 6))
а другое выглядит так:
data.frame(Species = c('Species1','Species1', 'Species2', 'Species3'),
N = c(10, 10, 11, 12),
Measurement1 = c(100, 100, 110, 120),
Measurement2 = c(1, 2, 3, 4))
Что я пытаюсь сделать, так это найти эффективный способ пересчета среднего значения для данного вида с учетом всех наблюдений для этого вида. В случае приведенного выше примера результаты будут выглядеть примерно так:
data.frame(Species=c('Species1','Species2','Species3'),
N=c(23,12,14),
Measurement1=c(101.3043,111.67,123.5714),
Measurement2=c(1.565,3,4.214))
Я знаю aggregate()
, что вычислит среднее значение для данного фрейма данных, но я не знаю ни одного простого способа пересчитать среднее значение нескольких суммированных средних значений или как это сделать, если количество записей меняется. Я знаю, что среднее значение можно пересчитать вручную, используя формулу
(X x * N x) (X y * N y) (X c * N c) / (N x N y N c)
но я не знаю, как записать это в R таким образом, чтобы это можно было сделать с различным количеством записей, заданных коэффициентом группировки.
Комментарии:
1. Похоже, в ваших данных есть какая-то проблема. (Скобки закрыты в неправильных местах.). Можете ли вы показать, как вы выполняете вычисления для общих данных? Как вы получаете
101.3043
asMeasurement1
на выходе, также какN
23?2. Я исправил кодировку. Для вычисления я делал все это вручную в Excel, поэтому я хотел бы попытаться найти решение для машинного обучения. Я получаю 101.3043, потому что есть 23 наблюдения (3 в первом кадре, 20 во втором разделении на две группы по 10), и поэтому я получаю ((10*100) (10*100) (100 110 120))/23.
Ответ №1:
Вы можете объединить два набора данных, а затем взять взвешенное среднее :
library(dplyr)
data1 %>%
mutate(N = 1) %>%
select(-Specimen) %>%
bind_rows(data2) %>%
group_by(Species) %>%
summarise(across(starts_with('Measurement'), weighted.mean, N),
N = sum(N))
# Species Measurement1 Measurement2 N
# <chr> <dbl> <dbl> <dbl>
#1 Species1 101. 1.57 23
#2 Species2 112. 3.08 12
#3 Species3 124. 4.21 14
Комментарии:
1. Как бы я это сделал для нескольких столбцов, которые не начинаются с «Измерения»? «Measurement1» — это просто имя фиктивной переменной, которую я использовал для целей этого вопроса.
2. Вы можете указать имена столбцов в
across
:summarise(across(c(col1, col2), weighted.mean, N)