我试图根据另一个数据帧(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)
但不能真正解决它。
答案 0 :(得分: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 :(得分: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
将遍历行,如果x <= 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 :(得分:2)
您可以使用rowSums
和subset
:
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
保持那些p值小于50%
的行大于0.05
。
数据强>
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"))