根据条件组合过滤数据行

时间:2020-07-10 08:53:46

标签: r dataframe

假设我们的df1具有p值:

Symbol     p1     p2     p3     p4     p5
AABT       0.01   0.12   0.23   0.02   0.32
ABC1       0.13   0.01   0.01   0.12   0.02
ACDC       0.15   0.01   0.34   0.24   0.01
BAM1       0.01   0.02   0.04   0.01   0.02
BCR        0.01   0.36   0.02   0.07   0.04
BDSM       0.02   0.43   0.01   0.03   0.41
BGL        0.27   0.77   0.01   0.04   0.02

和带有折叠更改的df2:

Symbol     FC1    FC2    FC3    FC4    FC5
AABT       1.21  -0.32   0.23  -0.72   0.45
ABC1       0.13   0.93  -1.61   0.12   1.03
ACDC       0.23   1.31   0.42  -0.39   1.50
BAM1      -1.33  -1.27  -0.89   1.22  -1.03
BCR        1.43  -0.25   1.29   0.54   0.97
BDSM       1.20   0.23  -1.98  -1.09  -0.31
BGL        0.33   0.12  -1.33  -1.14  -1.23

我想在df2中执行以下操作:

  1. 保留df1中3/5列中的值<0.05或更大的行
  2. 消除显示FC不一致迹象的行。仅当df1的p小于0.05(即显着)时,才应考虑FC。
  3. 以直观的顺序对结果数据进行排序,以便将具有正FC的行与具有负FC的行区分开,并在可能的情况下,将其在FC中的重要性顺序出现的行(例如FC3 FC4 FC5)与没有其他行(例如FC1 FC3 FC5)

例如,第1步将导致:

Symbol     FC1    FC2    FC3    FC4    FC5
ABC1       0.13   0.93  -1.61   0.12   1.03
BAM1      -1.33  -1.27  -0.89   1.22  -1.03
BCR        1.43  -0.25   1.29   0.54   0.97
BDSM       1.20   0.23  -1.98  -1.09  -0.31
BGL        0.33   0.12  -1.33  -1.14  -1.23

和步骤2,在:

Symbol     FC1    FC2    FC3    FC4    FC5
BCR        1.43  -0.25   1.29   0.54   0.97
BGL        0.33   0.12  -1.33  -1.14  -1.23

如何实现?我想使用for循环和count函数可以完成步骤1的工作,但是步骤2和3在我看来有些复杂。预先感谢您提供的优雅解决方案。

数据

df1:

df1 <- read.table(h=T,strin=F,text="Symbol     p1     p2     p3     p4     p5
AABT       0.01   0.12   0.23   0.02   0.32
ABC1       0.13   0.01   0.01   0.12   0.02
ACDC       0.15   0.01   0.34   0.24   0.01
BAM1       0.01   0.02   0.04   0.01   0.02
BCR        0.01   0.36   0.02   0.07   0.04
BDSM       0.02   0.43   0.01   0.03   0.41
BGL        0.27   0.77   0.01   0.04   0.02")

df2:

df2 <- read.table(h=T,strin=F,text="Symbol     FC1    FC2    FC3    FC4    FC5
AABT       1.21  -0.32   0.23  -0.72   0.45
ABC1       0.13   0.93  -1.61   0.12   1.03
ACDC       0.23   1.31   0.42  -0.39   1.50
BAM1      -1.33  -1.27  -0.89   1.22  -1.03
BCR        1.43  -0.25   1.29   0.54   0.97
BDSM       1.20   0.23  -1.98  -1.09  -0.31
BGL        0.33   0.12  -1.33  -1.14  -1.23")

1 个答案:

答案 0 :(得分:1)

我不确定这有多优雅,但是您可以使用applysapply进行子设置来获得所需的结果,如下所示:

# Create logical matrix telling us whether p values are significant
sig  <- apply(df1[-1], 2, function(x) x < 0.05)

# Create numeric matrix of the sign of each FC (will be either -1 or 1)
sign <- apply(df2[-1], 2, function(x) sign(x))

# Create a vector telling us whether there were 3 or more p < 0.05 in each row
ss1  <- apply(sig, 1, function(x) length(which(x)) > 2)

# Create a vector telling us whether all FC signs match excluding p = ns 
ss2  <- sapply(seq(nrow(df1)), function(i) length(table(sign[i,][sig[i,]])) == 1)

# Subset the data frames accordingly:
df1[ss1, ]
#>   Symbol   p1   p2   p3   p4   p5
#> 2   ABC1 0.13 0.01 0.01 0.12 0.02
#> 4   BAM1 0.01 0.02 0.04 0.01 0.02
#> 5    BCR 0.01 0.36 0.02 0.07 0.04
#> 6   BDSM 0.02 0.43 0.01 0.03 0.41
#> 7    BGL 0.27 0.77 0.01 0.04 0.02

df2[ss1 & ss2, ]
#>   Symbol  FC1   FC2   FC3   FC4   FC5
#> 5    BCR 1.43 -0.25  1.29  0.54  0.97
#> 7    BGL 0.33  0.12 -1.33 -1.14 -1.23

reprex package(v0.3.0)于2020-07-10创建