我正在寻找数据集中差异表达的基因。使用函数确定倍数变化后,我得到了一个返回基因名称和倍数变化的向量,如下所示:
df1
[,1]
gene1074 1.1135131
gene22491 1.0668137
gene15416 0.9840414
gene18645 1.1101060
gene4068 1.0055899
gene19043 1.1463878
我要查找变化大于2倍的任何东西,因此要执行此操作:
df2 <- subset(df1 >= 2)
返回以下内容:
head(df2)
[,1]
gene1074 FALSE
gene22491 FALSE
gene15416 FALSE
gene18645 FALSE
gene4068 FALSE
gene19043 FALSE
那不是我想要的。
我尝试了另一种子设置方法:
df2 <- df1[df1 >= 2]
返回:
head(df2)
[1] 4.191129 127.309557 2.788121 2.090916 11.382345 2.186330
现在这是超过2的值,但是我已经丢失了随之而来的基因名称。
我该如何对数据进行子集处理,使其以以下格式返回:
head(df2)
[,1]
genex 4.191129
geney 127.309557
genez 2.788121
genea 2.090916
geneb 11.382345
或者至少近似给定基因的格式及其对应的倍数变化值
答案 0 :(得分:0)
您正在寻找像这样的子集:
df2 <- df1[df1[, 1] >= 2, ]
为您显示一些数据:
# Create some toy data
df1 <- data.frame(val = rexp(100))
rownames(df1) <- paste0("gene", 1:100)
head(df1)
# val
#gene1 0.9295632
#gene2 1.2090513
#gene3 0.1550578
#gene4 1.7934942
#gene5 0.7286462
#gene6 1.8424025
现在,我们将df1
的第一列与2(df1[,1] > 2
)进行比较。该输出(逻辑向量)用于选择满足条件的行:
df2 <- df1[df1[,1] > 2, ]
head(df2)
#[1] 2.705683 3.410672 3.544905 3.695313 2.523586 2.229879
使用drop = FALSE
会将输出保留为data.frame
:
df3 <- df1[df1[,1] > 2, ,drop = FALSE]
head(df3)
# val
#gene8 2.705683
#gene9 3.410672
#gene22 3.544905
#gene23 3.695313
#gene38 2.523586
#gene42 2.229879
同样可以通过
subset(df1, subset = val > 2)
或
subset(df1, subset = df1[1,] > 2)
这两个表达式中的前一个在您的情况下不起作用,因为您似乎没有命名这些列。
答案 1 :(得分:0)
您还可以计算数据中与谓词相对应的位置,并将其用于索引:
# create some test data
df <- read.csv(
textConnection(
"g, v
gene1074, 1.1135131
gene22491, 1.0668137
gene15416, 0.9840414
gene18645, 1.1101060
gene4068, 1.0055899
gene19043, 1.1463878"
))
# positions that match a given predicate
idx <- which(df$v > 1)
# indexing "as usual"
df[idx, ]
输出:
g v
1 gene1074 1.113513
2 gene22491 1.066814
4 gene18645 1.110106
5 gene4068 1.005590
6 gene19043 1.146388
我发现这段代码读起来很不错,很直观,但这可能只是我的看法。