如何编写代码来处理 R 中 NA 值的平均重复?

问题描述 投票:0回答:1

我目前正在开展一个科学项目,其中每个样本都有两到三个重复。

数据(我们将数据框称为“原始”)看起来类似于:

| 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。在新的平均值数据框中,我仍然希望它显示:

  1. “NA”表示所有重复均为“NA”的样品。如果我在计算平均值时使用任何省略 NA 的函数,则任何具有至少一个变量中包含所有 NA 的重复样本都不会添加到新的平均值数据帧中,这不是我想要的。我仍然想查看新数据框中列出的所有样本,只是将它们的重复/三次值组合成平均值。

  2. 如果(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))
r group-by average na replicate
1个回答
0
投票

方法 #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 
© www.soinside.com 2019 - 2024. All rights reserved.