【问题标题】:Subset data frame and preserve row and column names子集数据框并保留行和列名称
【发布时间】:2013-12-23 04:04:53
【问题描述】:

我有一个包含相关值(-1.0 到 +1.0)的 71521 行 X 894 列数据框。行名称是基因名称,而列名称是 miRNA 名称。

我想创建一个仅包含以下相关值的子数据框(或矩阵,没关系): 1) -1.0 和 -0.9 之间(负校正) 2) +0.9 和 +1.0 之间(正校正) 3) 介于 -0.05 和 +0.05 之间(无相关性)

我使用了which() 函数,发现我的数据框中有 4,120 个负 corr、380,132 个正 corr 和 11,360,858 个非 corr 值。

我想创建一个包含这些相关分数的子集数据框,并保留相应的行和列名称,以识别与该分数对应的 miRNA-mRNA 关系。

基本上,一个包含 3 列的数据框或矩阵: miRNA_name ; mRNA_name ; Corr_Score

我尝试过编写嵌套的for loops,但我想知道是否有人知道更有效的方法。也许apply 和/或data.tables 的某种组合?

【问题讨论】:

  • 你能显示一些数据吗?使用 head() 对数据框进行切片。对于您的问题,子集()或聚合()可能会有所帮助。
  • “创建子数据框...”基于三个条件。这是否意味着您需要一个三个子数据帧,或者只有一个结合了三个条件的子数据帧?
  • @jlhoward - 无论哪种方式都可以。

标签: r performance subset bioinformatics correlation


【解决方案1】:

似乎是提取稀疏矩阵的好时机,我们可以乘以 abs(x) > 9 将所有小元素归零:

require(Matrix)
x <- matrix(runif(100), 10,10)
x <- Matrix(x * (abs(x) > .9), sparse=TRUE)
summary(x)
#10 x 10 sparse Matrix of class "dgCMatrix", with 14 entries
#    i  j            x
#1   3  1 0.9997396283
#2   8  1 0.9832526373
#3   5  2 0.9220406844
#4   8  2 0.9317862403
#5   6  3 0.9242458937
#6   3  5 0.9451522273
#7   6  5 0.9262013000
#8   4  6 0.9731352150
#9   5  6 0.9259489737
#10  8  8 0.9011057722
#11  1  9 0.9068403998
#12  8  9 0.9979463725
#13 10  9 0.9965988533
#14  3 10 0.9191754723

【讨论】:

    【解决方案2】:

    数据听起来应该是一个矩阵

    set.seed(123)
    m = matrix(runif(26*26, -1, 1), nrow=26, dimnames=list(letters, LETTERS))
    

    将其强制为“长”数据帧

    df = data.frame(Row=rownames(m)[row(m)], Col=colnames(m)[col(m)], 
                    Value=as.vector(m))
    

    和所需的子集

    df[df$Value > 0.9,]
    

    所以

    > head(df[df$Value > 0.9,])
        Row Col     Value
    11    k   A 0.9136667
    20    t   A 0.9090073
    24    x   A 0.9885396
    31    e   B 0.9260485
    87    i   D 0.9699140
    104   z   D 0.9089477
    

    如果您的意思是 >0.9 或

    df[df$Value > 0.9 | df$Value < -0.9,]
    

    【讨论】:

    • ^Martin Morgan 又来了!就像我上面说的,另一个 R ninja 出现了。再次感谢!你以前帮助过我,将来你很有可能会看到我的另一个问题;)
    【解决方案3】:

    基本上,一个数据框或矩阵包含 3 列: miRNA_name ; mRNA_name ; Corr_Score

    你可以使用melt:

    cor(longley, method = "spearman")
    melt(cor(longley, method = "spearman"))
    

    然后做子集...

    【讨论】:

    • 子集?我阅读了'melt()'函数。它似乎只是分成单独的行。这有什么帮助?
    • melt 将 data.frame 带入长格式。然后您可以提取 > 0.9 的相关性。很像@Martin Morgans 的回答。
    【解决方案4】:

    看起来 within()subset() 可以帮助你:

    data = data.frame(correl = runif(100, -1, 1), y = rnorm(100), z = sample(letters, 100, TRUE))
    
    data = within(data, {
          label = ifelse(correl > -1.0 & correl < -0.9, 'Neg', ifelse(correl > 0.9 & correl < 1.0, 'Pos', 'None'))  
    })
    
    data = subset(data, label != 'None')
    
    require(reshape2)
    data2 = melt(data, id = 'label')
    
    print(data2)
    

    根据“标签”对行进行分类然后堆叠。您可以更改“id”参数 看你需要什么。

    PS:当 correl 介于 -0.9 和 0.9 之间时,您似乎错过了条件。

    【讨论】:

    • 谢谢!我仍然不确定如何在我的数据框中实现这一点。您创建的数据框只有 3 列开始。我的有 894。我想把它变成一个 3 列的数据框。
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2019-09-06
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多