如何在保留行名的同时对向量进行子集化?

时间:2018-10-17 17:45:36

标签: r matrix subset logical-operators

我正在寻找数据集中差异表达的基因。使用函数确定倍数变化后,我得到了一个返回基因名称和倍数变化的向量,如下所示:

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

或者至少近似给定基因的格式及其对应的倍数变化值

2 个答案:

答案 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

我发现这段代码读起来很不错,很直观,但这可能只是我的看法。