子集数据框并保留行和列名称

时间:2013-12-05 23:42:33

标签: r performance subset bioinformatics correlation

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

我想创建一个仅包含相关值的子数据框(或矩阵,无关紧要): 1)介于-1.0和-0.9之间(负corr) 2)在+0.9和+1.0之间(正corr) 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 loop,但我想知道是否有人知道更有效的方法。也许是apply和/或data.tables

的某种组合

4 个答案:

答案 0 :(得分:3)

似乎是抽出稀疏矩阵的好时机,我们可以乘以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

答案 1 :(得分:1)

  

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

您可以使用melt

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

然后进行子集化...

答案 2 :(得分:1)

看起来 in() 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 :(得分:1)

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

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

将其强制转换为“长”data.frame

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
如果你的意思是&gt; 0.9 OR&lt;

使用逻辑表达式-0.9等。

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