2016-06-29 183 views
2

我想根据另一个数据帧(PvalueData)中的p值的条件过滤掉我的数据框(MainData)中的行。所以,我想要的是:如果连续超过50%的柱子的p值大于0.05(PvalueData),那么该特定行将从主数据框(MainDatA)中移除。如何根据另一个数据帧的值删除数据帧中的行

可以说,这里是数据我有:

MainData:

 C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene3 43 93 90 43 92 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene6 42 34 53 85 43 
Gene7 49 55 67 49 89 
Gene8 25 45 49 34 35 
Gene9 19 16 54 53 94 

PvalueData:

 C1  C2  C3  C4  C5 
Gene1 0.04 0.01 0.01 0.01 0.01 
Gene2 0.01 0.01 0.01 0.02 0.01 
Gene3 0.01 0.07 0.09 0.01 0.06 
Gene4 0.01 0.03 0.06 0.01 0.02 
Gene5 0.04 0.01 0.07 0.08 0.01 
Gene6 0.09 0.07 0.01 0.06 0.06 
Gene7 0.10 0.07 0.01 0.01 0.06 
Gene8 0.01 0.01 0.02 0.01 0.01 
Gene9 0.09 0.01 0.07 0.08 0.06 

所以我的结果文件应该是这样:

结果:

 C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene8 25 45 49 34 35 

我曾尝试这样的事:

check = if (PvalueData[!rowSums(PvalueData>thres) > ncol(PvalueData)*.5], MainData) 

但真的不能工作了。

+1

加上'dput'数据或数据。例如 – user5249203

回答

5

下面是使用rowMeans答案:

df[rowMeans(df2 < 0.05) > 0.5,] 
     C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene8 25 45 49 34 35 

下面是代码的快速故障:

  • df2 < 0.05胁迫的data.frame成由逻辑元件的矩阵(TRUE和FALSE)如果元素符合您的p值标准,则元素为TRUE。
  • rowMeans计算每行的这些逻辑值的平均值。
  • 这些手段用于根据第二条准则对主要数据框进行子集划分。

数据

df <- read.table(header=T, text="C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene3 43 93 90 43 92 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene6 42 34 53 85 43 
Gene7 49 55 67 49 89 
Gene8 25 45 49 34 35 
Gene9 19 16 54 53 94") 

df2 <- read.table(header=T, text="C1  C2  C3  C4  C5 
Gene1 0.04 0.01 0.01 0.01 0.01 
Gene2 0.01 0.01 0.01 0.02 0.01 
Gene3 0.01 0.07 0.09 0.01 0.06 
Gene4 0.01 0.03 0.06 0.01 0.02 
Gene5 0.04 0.01 0.07 0.08 0.01 
Gene6 0.09 0.07 0.01 0.06 0.06 
Gene7 0.10 0.07 0.01 0.01 0.06 
Gene8 0.01 0.01 0.02 0.01 0.01 
Gene9 0.09 0.01 0.07 0.08 0.06") 
+1

我的坏。我错过了0.5,我认为它是0.05。好的解决方案:)。 – LyzandeR

3

也许不是最有效的方式,但在基础R你可以使用一个简单的apply

df1[apply(df2, 1, function(x) sum(x <= 0.05) >= 3), ] 
#  C1 C2 C3 C4 C5 
#Gene1 70 54 54 75 75 
#Gene2 23 18 16 54 15 
#Gene4 32 50 23 13 45 
#Gene5 44 53 46 34 47 
#Gene8 25 45 49 34 35 

本质apply将通过行,如果迭代总和×< = 0.05大于(或等于)3则返回TRUE否则返回FALSE。然后,我们使用这个逻辑矢量子集DF1

数据

df1 <- read.table(text = "  C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene3 43 93 90 43 92 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene6 42 34 53 85 43 
Gene7 49 55 67 49 89 
Gene8 25 45 49 34 35 
Gene9 19 16 54 53 94") 

df2 <- read.table(text = "  C1  C2  C3  C4  C5 
Gene1 0.04 0.01 0.01 0.01 0.01 
Gene2 0.01 0.01 0.01 0.02 0.01 
Gene3 0.01 0.07 0.09 0.01 0.06 
Gene4 0.01 0.03 0.06 0.01 0.02 
Gene5 0.04 0.01 0.07 0.08 0.01 
Gene6 0.09 0.07 0.01 0.06 0.06 
Gene7 0.10 0.07 0.01 0.01 0.06 
Gene8 0.01 0.01 0.02 0.01 0.01 
Gene9 0.09 0.01 0.07 0.08 0.06") 
2

这是你可以使用rowSumssubset做什么:

subset(df, rowSums(df2>.05)<ceiling(ncol(df)/2)) 

     # C1 C2 C3 C4 C5 
# Gene1 70 54 54 75 75 
# Gene2 23 18 16 54 15 
# Gene4 32 50 23 13 45 
# Gene5 44 53 46 34 47 
# Gene8 25 45 49 34 35 

让那些行,不到50%的p值大于0.05

DATA

df <- structure(list(C1 = c(70L, 23L, 43L, 32L, 44L, 42L, 49L, 25L, 
19L), C2 = c(54L, 18L, 93L, 50L, 53L, 34L, 55L, 45L, 16L), C3 = c(54L, 
16L, 90L, 23L, 46L, 53L, 67L, 49L, 54L), C4 = c(75L, 54L, 43L, 
13L, 34L, 85L, 49L, 34L, 53L), C5 = c(75L, 15L, 92L, 45L, 47L, 
43L, 89L, 35L, 94L)), .Names = c("C1", "C2", "C3", "C4", "C5" 
), class = "data.frame", row.names = c("Gene1", "Gene2", "Gene3", 
"Gene4", "Gene5", "Gene6", "Gene7", "Gene8", "Gene9")) 

df2 <- structure(list(C1 = c(0.04, 0.01, 0.01, 0.01, 0.04, 0.09, 0.1, 
0.01, 0.09), C2 = c(0.01, 0.01, 0.07, 0.03, 0.01, 0.07, 0.07, 
0.01, 0.01), C3 = c(0.01, 0.01, 0.09, 0.06, 0.07, 0.01, 0.01, 
0.02, 0.07), C4 = c(0.01, 0.02, 0.01, 0.01, 0.08, 0.06, 0.01, 
0.01, 0.08), C5 = c(0.01, 0.01, 0.06, 0.02, 0.01, 0.06, 0.06, 
0.01, 0.06)), .Names = c("C1", "C2", "C3", "C4", "C5"), class = "data.frame", row.names = c("Gene1", 
"Gene2", "Gene3", "Gene4", "Gene5", "Gene6", "Gene7", "Gene8", 
"Gene9")) 
相关问题