R 如何基于另一个数据帧的值删除数据帧中的行
我试图根据另一个数据帧(PvalueData)中的p值标准筛选出数据帧(MainData)中的行。所以,我想要的是:如果一行中超过50%的列的p值>0.05(PvalueData),那么该特定行将从主数据帧(MainDatA)中删除 比如说,以下是我掌握的数据: 主要数据:R 如何基于另一个数据帧的值删除数据帧中的行,r,dataframe,filtering,rows,R,Dataframe,Filtering,Rows,我试图根据另一个数据帧(PvalueData)中的p值标准筛选出数据帧(MainData)中的行。所以,我想要的是:如果一行中超过50%的列的p值>0.05(PvalueData),那么该特定行将从主数据帧(MainDatA)中删除 比如说,以下是我掌握的数据: 主要数据: C1 C2 C3 C4 C5 Gene1 70 54 54 75 75 Gene2 23 18 16 54 15 Gene3 43 93 9
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)
但无法真正解决问题。以下是使用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
也许不是最有效的方法,但在base 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
这是您可以使用
行和
和子集
执行的操作:
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
添加数据或示例数据My bad的
dput
。我错过了0.5,我以为是0.05。很好的解决方案:)。
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")
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
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"))