通过循环遍历另一个数据帧来映射数据帧的元素

时间:2011-10-03 09:51:34

标签: r comparison dataframe

我有两个不同尺寸的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列中查看。

基本上我想用GENESpattern1.match覆盖字段df2$Genesdf2$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) 
}

在没有几乎杀死计算机的情况下,还有另一种方法吗?

2 个答案:

答案 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”,但未在数据中看到它。