【问题标题】:How do I subset a vector while retaining row names?如何在保留行名的同时对向量进行子集化?
【发布时间】:2018-10-17 17:45:35
【问题描述】:

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

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

或者至少近似于我被赋予基因的格式及其对应的倍数变化值

【问题讨论】:

  • 试试df1[df1 &gt;= 2, , drop = FALSE]
  • 好的做法是与 dput() 共享数据。您分享的内容看起来像矩阵,而不是向量。

标签: r matrix subset logical-operators


【解决方案1】:

您正在寻找这样的子集:

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] &gt; 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)

这两个表达式中的前一个不适用于您的情况,因为您似乎没有命名列。

【讨论】:

  • 我为列添加了一个名称,最后两个选项都对我有用。谢谢!
【解决方案2】:

您还可以计算数据中与您的谓词相对应的位置,并将它们用于索引:

# 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2017-03-26
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多