我有一个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
?
答案 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,]