【问题标题】:How do I select specific values in a row to average if another number in the row equals a certain value?如果行中的另一个数字等于某个值,如何选择一行中的特定值进行平均?
【发布时间】:2014-03-15 07:14:54
【问题描述】:

我为这个问题的标题道歉,但除非你看到这个问题,否则很难用一行来解释。

假设我有一个日志折叠变化值表(logFC 列)和与之关联的 FDR(错误发现率)值(BH 列)。

data <- matrix(NA,10,6)
colnames(data) <-c("logFCa","BHa","logFCb","BHb","logFCc","BHc")
data
row.names(data) <- LETTERS[seq(from = 1,to = 10)]

data[,1] <- 1
data[,2] <- c(1.000 ,0.001, 0.500, 0.500, 0.500, 0.010, 0.001, 0.200, 0.001, 0.001 )
data[,3] <- 2
data[,4] <- c(0.500 ,0.200 ,0.300, 0.001 ,0.020, 1.000, 0.001, 0.001, 3.000 ,0.001 )
data[,5] <- 3
data[,6] <- c(0.4000, 0.6000 ,0.5000, 0.4000, 0.7000, 0.0001, 0.9900, 0.0010, 0.0010, 0.0010 )

logFCa   BHa logFCb   BHb logFCc    BHc
A      1 1.000      2 0.500      3 0.4000
B      1 0.001      2 0.200      3 0.6000
C      1 0.500      2 0.300      3 0.5000
D      1 0.500      2 0.001      3 0.4000
E      1 0.500      2 0.020      3 0.7000
F      1 0.010      2 1.000      3 0.0001
G      1 0.001      2 0.001      3 0.9900
H      1 0.200      2 0.001      3 0.0010
I      1 0.001      2 3.000      3 0.0010
J      1 0.001      2 0.001      3 0.0010

如果两个或多个相关的 BH 值小于 0.01,我想做的是计算 logFCa、logFCb 和/或 logFCc 的平均值。我的第一次尝试如下。如果 BHa

#BHa < 0.01 = 1
#sigA
sigA <- ifelse(data[,2]<0.01, 1 , NA )
data <- data.frame(data, sigA)

#BHb < 0.01 = 3
#sigB
sigB <- ifelse(data[,4]<0.01, 3, NA )
data <- data.frame(data, sigB)

#BHc < 0.01 = 5
#sigC
sigC <- ifelse(data[,6] < 0.01 , 5, NA )
data <- data.frame(data, sigC)

#Make column of row sums
keep <- c("sigA", "sigB", "sigC")
dataABC <- data[keep]
dataABC
data$ABC <- rowSums(dataABC, na.rm =TRUE)

所以现在我有了这个……

> data
  logFCa   BHa logFCb   BHb logFCc    BHc sigA sigB sigC ABC
A      1 1.000      2 0.500      3 0.4000   NA   NA   NA   0
B      1 0.001      2 0.200      3 0.6000    1   NA   NA   1
C      1 0.500      2 0.300      3 0.5000   NA   NA   NA   0
D      1 0.500      2 0.001      3 0.4000   NA    3   NA   3
E      1 0.500      2 0.020      3 0.7000   NA   NA   NA   0
F      1 0.010      2 1.000      3 0.0001   NA   NA    5   5
G      1 0.001      2 0.001      3 0.9900    1    3   NA   4
H      1 0.200      2 0.001      3 0.0010   NA    3    5   8
I      1 0.001      2 3.000      3 0.0010    1   NA    5   6
J      1 0.001      2 0.001      3 0.0010    1    3    5   9

但是,如果关联的 BH 列小于 0.01,我希望以下列具有 logFC 值的平均值。我想做的就是说……

如果 ABC 列小于 4,则设为“NA”

4 = logFCa 和 logFCb 的平均值

5 = “不适用”

6 = logFCa 和 logFCc 的平均值

8 = logFCb 和 logFCc 的平均值

9 = logFCa 和 logFCb 和 logFCc 的平均值

所以决赛桌看起来像……

 logFCa   BHa logFCb   BHb logFCc    BHc sigA sigB sigC ABC means
A      1 1.000      2 0.500      3 0.4000   NA   NA   NA   0    NA
B      1 0.001      2 0.200      3 0.6000    1   NA   NA   1    NA
C      1 0.500      2 0.300      3 0.5000   NA   NA   NA   0    NA
D      1 0.500      2 0.001      3 0.4000   NA    3   NA   3    NA
E      1 0.500      2 0.020      3 0.7000   NA   NA   NA   0    NA
F      1 0.010      2 1.000      3 0.0001   NA   NA    5   5    NA
G      1 0.001      2 0.001      3 0.9900    1    3   NA   4   1.5
H      1 0.200      2 0.001      3 0.0010   NA    3    5   8   2.5
I      1 0.001      2 3.000      3 0.0010    1   NA    5   6   2.0
J      1 0.001      2 0.001      3 0.0010    1    3    5   9   2.0

不要误会,最后一个平均值 2.0 是根据所有三个 logFC 值(即 1,2 和 3)计算得出的平均值 2,而不是上面一行中的值 2.0,它是从logFCa 和 logFCC。任何帮助将不胜感激!!!谢谢!

编辑。我应该补充一点,这个例子只是一个测试数据集。我想将此技术应用于大约 6000 行但列数相似的矩阵。

【问题讨论】:

    标签: r matrix average


    【解决方案1】:

    我假设您只想要 means 列。应该这样做:

    df         <- data.frame(data)
    df$include <- with(df,(BHa<0.01)+(BHb<0.01)+(BHc<0.01)>1)
    df$means   <- apply(df,1,function(x) 
                               ifelse(x[7],mean(x[2*which(x[c(2,4,6)]<0.01)-1]),NA))
    df         <- df[,-7]   # get rid of column "include"
    df
    #   logFCa   BHa logFCb   BHb logFCc    BHc means
    # A      1 1.000      2 0.500      3 0.4000    NA
    # B      1 0.001      2 0.200      3 0.6000    NA
    # C      1 0.500      2 0.300      3 0.5000    NA
    # D      1 0.500      2 0.001      3 0.4000    NA
    # E      1 0.500      2 0.020      3 0.7000    NA
    # F      1 0.010      2 1.000      3 0.0001    NA
    # G      1 0.001      2 0.001      3 0.9900   1.5
    # H      1 0.200      2 0.001      3 0.0010   2.5
    # I      1 0.001      2 3.000      3 0.0010   2.0
    # J      1 0.001      2 0.001      3 0.0010   2.0
    

    首先,如果两个或多个BH include = T。 然后,我们对df 的每一行依次“应用”一个函数。该函数执行此操作:如果 include=F 对应该行,则返回 NA,否则确定 BH 中的哪些列 logFC 列的平均值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多