Расчет геометрического среднего значения данных, который включает НС

РЕДАКТИРОВАТЬ: проблема была не в функции geoMean, а в неправильном использовании aggregate(), как объяснено в комментариях

Я пытаюсь вычислить среднее геометрическое нескольких измерений для нескольких разных видов, включая NA. Пример моих данных выглядит так:

species <- c("Ae", "Ae", "Ae", "Be", "Be")
phen <- c(2, NA, 3, 1, 2)
hveg <- c(NA, 15, 12, 60, 59)

df <- data.frame(species, phen, hveg)

Когда я пытаюсь вычислить среднее геометрическое для вида Ae с помощью встроенной функции geoMean из пакета EnvStats, как это

library("EnvStats")
aggregate(df[, 3:3], list(df1$Sp), geoMean, na.rm=TRUE)

это прекрасно работает и пропускает NA, чтобы дать мне геометрические средства для каждого вида.

Group.1     phen      hveg
1      Ae 4.238536 50.555696
2      Be 1.414214  1.414214

Однако, когда я делаю это с моим большим набором данных, функция спотыкается над NA и возвращает NA как результат, даже если есть, например, 10 числовых значений и только один NA. Это происходит, например, со столбцом SLA_mm2/mg. Мой большой набор данных выглядит так:

> str(cut2trait1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   22 obs. of  19 variables:
 $ Cut                : chr  "15_08" "15_08" "15_08" "15_08" ...
 $ Block              : num  1 1 1 1 1 1 1 1 1 1 ...
 $ ID                 : num  451 512 431 531 591 432 551 393 511 452 ...
 $ Plot               : chr  "1_1" "1_1" "1_1" "1_1" ...
 $ Grazing            : chr  "n" "n" "n" "n" ...
 $ Acro               : chr  "Leuc.vulg" "Dact.glom" "Cirs.arve" "Trif.prat" ...
 $ Sp                 : chr  "Lv" "Dg" "Ca" "Tp" ...
 $ Label_neu          : chr  "Lv021" "Dg022" "Ca021" "Tp021" ...
 $ PlantFunctionalType: chr  "forb" "grass" "forb" "forb" ...
 $ PlotClimate        : chr  "AC" "AC" "AC" "AC" ...
 $ Season             : chr  "Aug" "Aug" "Aug" "Aug" ...
 $ Year               : num  2015 2015 2015 2015 2015 ...
 $ Tiller             : num  6 3 3 5 6 8 5 2 1 7 ...
 $ Hveg               : num  25 38 70 36 68 65 23 58 71 27 ...
 $ Hrep               : num  39 54 77 38 76 70 65 88 98 38 ...
 $ Phen               : num  8 8 7 8 8 7 6.5 8 8 8 ...
 $ SPAD               : num  40.7 42.4 48.7 43 31.3 ...
 $ TDW_in_g           : num  4.62 4.85 11.86 5.82 8.99 ...
 $ SLA_mm2/mg         : num  19.6 19.8 20.3 21.2 21.7 ...

и результат моего кода

gm_cut2trait1 <- aggregate(cut2trait1[, 13:19], list(cut2trait1$Sp), geoMean, na.rm=TRUE)

is (только первые две строки):

Group.1    Tiller     Hveg      Hrep     Phen     SPAD  TDW_in_g     SLA_mm2/mg
1       Ae 13.521721 73.43485 106.67933       NA 28.17698 1.2602475           NA
2       Be  8.944272 43.95452  72.31182 5.477226 20.08880 0.7266361   9.309672

Здесь среднее геометрическое SLA для Ae равно NA, хотя имеется 9 числовых измерений и только один NA в столбце, который используется для расчета среднего геометрического.

Я попытался использовать функцию среднего геометрического, предложенную здесь: Среднее геометрическое: есть ли встроенная? Но вместо NA это вернуло значение 1.000 при использовании с моим большим набором данных, что не решает мою проблему.

Итак, мой вопрос: в чем разница между моим примером df и большим набором данных, который выбрасывает функцию geoMean с рельсов?

0 ответов

Другие вопросы по тегам