编辑:问题不在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)
当我尝试使用 EnvStats 包中的内置函数 geoMean 计算物种 Ae 的几何平均值时,如下所示
library("EnvStats")
aggregate(df[, 3:3], list(df1$Sp), geoMean, na.rm=TRUE)
它工作得很好并且跳过了 NAs 给我每个物种的几何平均值。
Group.1 phen hveg
1 Ae 4.238536 50.555696
2 Be 1.414214 1.414214
然而,当我对我的大型数据集执行此操作时,即使有例如 10 个数值且只有一个 NA,该函数也会在 NA 上绊倒并返回 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)
是(只有前两行):
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
此处,Ae 的 SLA 几何平均值为 NA,即使有 9 个数值测量值且用于计算几何平均值的列中只有一个 NA。
我尝试使用这里建议的几何平均函数: 几何平均:有内置的吗? 但是当与我的大数据集一起使用时,这不是 NA,而是返回值 1.000,这并不能解决我的问题。
所以我的问题是:我的示例 df 和使 geoMean 函数偏离轨道的大数据集有什么区别?