【问题标题】:Filtering out the value with a threshold among the rows and getting average在行中过滤出具有阈值的值并取平均值
【发布时间】:2021-11-28 10:56:02
【问题描述】:

我有一个质谱测量数据集。因此,在这个小子集中,存在重复但强度不同的行或肽段。

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

所以我的目标

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

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

5   P08032    133.4400

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

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

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

任何建议或帮助将不胜感激

更新

虽然我从人们认为最大阈值的论文中读到。如果强度高于 5000,我可以服用,但我不确定其余肽是否低于 5000,我该如何考虑。

但现在我会接受这个 5000 的截止点。

【问题讨论】:

  • 如果您在问题中包含阈值列表或有关如何计算阈值的一些信息,将会有所帮助。 (;
  • 好的,让我补充一下。如果我以一种简单的方式思考,我会考虑每个元素中的最高值,但我想这将是有偏见的,或者我不确定!!

标签: r dataframe average


【解决方案1】:

分享解决上述问题的 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

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2018-12-21
    • 2022-12-23
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多