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

3
我有一个71521行x894列的数据框,其中包含相关值(-1.0至+1.0)。行名是基因名称,而列名是miRNA名称。
我想创建一个子数据框(或矩阵,无所谓),其中只包含以下相关值: 1)在-1.0和-0.9之间(负相关) 2)在+0.9和+1.0之间(正相关) 3)在-0.05和+0.05之间(无关联)
我使用了which()函数,并发现我的数据框中有4,120个负相关,380,132个正相关和11,360,858个非相关值。
我想创建一个子集数据框,其中包含这些相关性分数,并保留相应的行和列名称以识别对应于该分数的miRNA-mRNA关系。
基本上,一个包含3列的数据框或矩阵:miRNA_name; mRNA_name; Corr_Score 我尝试编写嵌套的for loop,但我想知道是否有更有效的方法。也许是apply和/或data.tables的某种组合?

你能展示一些数据吗?使用head()来切片你的数据框。对于你的问题,subset()或aggregate()可能会有所帮助。 - Fernando
基于三个条件创建一个子数据框,这是指你要创建三个子数据框还是只创建一个包含三个条件的子数据框? - jlhoward
@jlhoward - 任何一种方式都可以。 - tomathon
4个回答

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

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,]

so

> 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或<-0.9等,请使用逻辑表达式。

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

马丁·摩根再次出手了!就像我之前说的,又一个 R 语言高手帮忙了。再次感谢!你之前已经帮过我了,未来很可能还会有我的问题需要你的帮助 ;) - tomathon

1
基本上,一个包含3列的数据框或矩阵:miRNA_name; mRNA_name; Corr_Score。
您可以使用melt:
cor(longley, method = "spearman")
melt(cor(longley, method = "spearman"))

然后进行子集操作...


子集?我阅读了“melt()”函数的资料。看起来它只是将数据分离成单独的行。那有什么用处呢? - tomathon
melt函数可以将数据框转换为长格式,然后你就可以提取大于0.9的相关性了。这很像@Martin Morgan的答案。 - EDi

1
看起来 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列的数据框。 - tomathon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接