在行中用阈值过滤掉值并取平均值

Filtering out the value with a threshold among the rows and getting average

我有一个来自质谱测量的数据集。所以在这个小子集中有重复但强度不同的行或肽。

a <- dput(test_Data)
structure(list(UNIPROT = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("A8DUK4", "P08032", "P15508"), class = "factor"), 
    Intensity = c(16926.19, 36738.94, 2203.22, 5338.85, 133.44, 
    27991.35, 29505.84, 201.4695, 47469.09, 24841.01, 4546.9, 
    22805.69, 18494.71, 28805.99, 68220.65, 90526.29, 63259.19, 
    44492.48, 65497.13, 40704.81, 334874.1, 38702.87, 300135)), class = "data.frame", row.names = c(NA, 
-23L))

数据框

UNIPROT   Intensity
1   P08032  16926.1900
2   P08032  36738.9400
3   P08032   2203.2200
4   P08032   5338.8500
5   P08032    133.4400
6   P08032  27991.3500
7   P08032  29505.8400
8   P15508    201.4695
9   P15508  47469.0900
10  P15508  24841.0100
11  P15508   4546.9000
12  P15508  22805.6900
13  P15508  18494.7100
14  P15508  28805.9900
15  A8DUK4  68220.6500
16  A8DUK4  90526.2900
17  A8DUK4  63259.1900
18  A8DUK4  44492.4800
19  A8DUK4  65497.1300
20  A8DUK4  40704.8100
21  A8DUK4 334874.1000
22  A8DUK4  38702.8700
23  A8DUK4 300135.0000

所以我的objective

我必须只保留重复行中的一个值,但在取出平均值之后。

如果是我的第一个肽,我不想考虑这一行

5   P08032    133.4400

我的想法是只取出高于某个阈值的那些行,如果超过阈值则取平均值并添加或生成一个新的数据框,其中只保留唯一行及其平均值。

所以每个人都可以为这些单独的唯一行定义不同的阈值。

在我的小子集中,我有三个独特的行。那么我是否可以设置三个不同的阈值然后得到平均值 .

如有任何建议或帮助,我们将不胜感激

更新

尽管我从论文中读到人们认为是最大阈值。如果强度高于 5000,我可能会接受,但我再次不确定是否剩余的肽小于 5000,我该如何考虑。

但现在我将以 5000 为界。

分享3个方法解决上述问题

方法一:使用aggregate函数

aggregate(test_Data[test_Data$Intensity >= 5000, 2], list(test_Data[test_Data$Intensity >= 5000, ]$UNIPROT), FUN = mean)

输出:

  Group.1         x
1  A8DUK4 116268.06
2  P08032  23300.23
3  P15508  28483.30

方法二:使用dplyr

library(dplyr)
test_Data %>% 
  filter(Intensity >= 5000) %>%
  group_by(UNIPROT) %>%
  summarise(Mean_Intensity = mean(Intensity))

输出:

# A tibble: 3 x 2
  UNIPROT Mean_Intensity
  <fct>            <dbl>
1 A8DUK4         116268.
2 P08032          23300.
3 P15508          28483.

方法三:使用data.table

library(data.table)
setDT(test_Data) # Converting to data.table object (necessary step)

test_Data[Intensity >= 5000,.(Mean_Intensity = mean(Intensity)), by = .(UNIPROT)]

输出:

   UNIPROT Mean_Intensity
1:  P08032       23300.23
2:  P15508       28483.30
3:  A8DUK4      116268.06