我有两个不同尺寸的R数据框。但是,数据框有id
列
DF1:
nrow(df1)=22308
c1 c2 c3 pattern1.match
ENSMUSG00000000001_at 10.175115 10.175423 10.109524 0
ENSMUSG00000000003_at 2.133651 2.144733 2.106649 0
ENSMUSG00000000028_at 5.713781 5.714827 5.701983 0
DF2:
Genes Pattern.Count
ENSMUSG00000000276 ENSMUSG00000000276_at 1
ENSMUSG00000000876 ENSMUSG00000000876_at 1
ENSMUSG00000001065 ENSMUSG00000001065_at 1
ENSMUSG00000001098 ENSMUSG00000001098_at 1
nrow(df2)=425
我想循环遍历df2
,找到所有pattern.count=1
的基因并在df1$pattern1.match
列中查看。
基本上我想用GENES
和pattern1.match
覆盖字段df2$Genes
和df2$Pattern.Count
。来自df2$Pattern.Count
的所有元素都等于一。
我编写了这个函数,但R在循环遍历所有这些行时冻结。
idcol <- ncol(df1)
return.frame.matches <- function(df1, df2, idcol) {
for (i in 1:nrow(df1)) {
for (j in 1:nrow(df2))
if(df1[i, 1] == df2[j, 1]) {
df1[i, idcol] = 1
break
}
}
return (df1)
}
在没有几乎杀死计算机的情况下,还有另一种方法吗?
答案 0 :(得分:0)
我不确定我到底在做什么,但以下情况至少可以让你更接近。
df1
的第一列似乎没有名称,是rownames
吗?
如果是的话,
df1$Genes <- rownames(df1)
然后你可以用merge
创建一个包含所需基因的新数据框:
merge(df1,subset(df2,Pattern.Count==1))
请注意,它们在公共列Genes
上匹配。我不确定您要对pattern1.match
列做什么,但subset
部分的df1
部分merge
可以包含条件。
修改强>
通过评论中的额外信息
df1$pattern1.match <- as.numeric(df1$Genes %in% df2$Genes)
应该达到你想要的目标。
答案 1 :(得分:0)
您的样本数据不足以解决,但这是我要开始的:
dfm <- merge( df1, df2, by = idcol, all = TRUE )
dfm_pc <- subset( dfm, Pattern.Count == 1 )
我从您的代码中获取了“idcol”,但未在数据中看到它。