我目前正在开展一个科学项目,其中每个样本都有两到三个重复。
数据(我们将数据框称为“原始”)看起来类似于:
| SampleID | Var1 | Var2 | Var3 |...
| Unknown 1 | NA | 12 | NA |
| Unknown 1 | NA | 19 | 23 |
| Unknown 2 | NA | NA | 50 |
| Unknown 2 | 18.5 | NA | 32 |
| Unknown 2 | 8.12 | NA | 20 |
...
未知 1 有两个重复,未知 2 有三个重复。 NA 适用于由于信号太强/太低而无法获取值的情况。
我想创建一个名为“averages”的新数据框,其中包含所有 Var# 列上每个组(样本 ID)的重复平均值,以便它看起来更像这样:
每个样本在不同变量上的平均值
| SampleID | Var1 | Var2 | Var3 |...
| Unknown 1 | NA | 15.5 | 23 |
| Unknown 2 | 26.62 | NA | 51 |
...
我正在努力解决的是在计算平均值时按照我想要的方式处理 NA。在新的平均值数据框中,我仍然希望它显示:
“NA”表示所有重复均为“NA”的样品。如果我在计算平均值时使用任何省略 NA 的函数,则任何具有至少一个变量中包含所有 NA 的重复样本都不会添加到新的平均值数据帧中,这不是我想要的。我仍然想查看新数据框中列出的所有样本,只是将它们的重复/三次值组合成平均值。
如果(2 中的 1)或(3 中的 2)重复包含 NA 值,我希望省略这些 NA 值。例如,在上表中,“Unknown 2”具有一式三份值,而在“Var1”中,有一个三份值是 NA,而其他三份值是“18.5”和“8.12”。因此,我希望省略 NA 值,并且平均计算看起来像 (18.5 + 8.12)/2,即使应该有 3 个重复值。
#Approach 1 - 一次仅适用于一列,忽略重复值均具有 NA 值的样本
averages <- aggregate(raw$'Var1', list(raw$SampleID), FUN=mean, na.rm=TRUE)
#方法 2 - 在均值计算中没有忽略 NA
averages <- aggregate(.~SampleID, raw, mean, na.rm=TRUE)
#方法 3 - #尝试将 colname 放入列表中,然后在以下代码中调用该列表。如果样本具有 NA 值的重复,则会出现同样的问题。
avgcolnames <- colnames(raw[,sapply(results,is.numeric)])
averages <- aggregate(cbind(avgcolnames) ~ SampleID, data = raw,
FUN = mean, na.rm = TRUE)
#方法 4 - # 一次只处理一列,并且必须指定新的列名称
averages <- raw %>%
group_by(SampleID) %>%
summarize(Var1 = mean(Var1, na.rm = TRUE))
方法 #4 正在实施中,下一步是使其通用,我们可以使用
tidy-select
功能和匿名函数来实现:
library(tidyverse)
iris %>%
group_by(Species) %>%
summarize(across(where(is.numeric), ~ mean(.x, na.rm=TRUE)))
## # A tibble: 3 × 5
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 setosa 5.01 3.43 1.46 0.246
## 2 versicolor 5.94 2.77 4.26 1.33
## 3 virginica 6.59 2.97 5.55 2.03