2011-10-03 95 views
0

我有两个具有不同维度的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栏中查看。

基本上我想用df2$Genesdf2$Pattern.Count覆盖字段GENESpattern1.matchdf2$Pattern.Count中的所有元素都等于1。

我写了这个函数,但是当循环遍历所有这些行时,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

我不确定我是否确切地知道你在做什么,但下面至少应该让你更接近。

df1的第一列似乎没有名称,它们是rownames

如果是这样,

df1$Genes <- rownames(df1) 

然后,你可以再做一个merge创建一个新的数据框与您所需要的基因:

merge(df1,subset(df2,Pattern.Count==1)) 

注意他们在公共列Genes匹配。我不确定您想要对pattern1.match列做什么,但mergedf1部分上的subset可以包含相关条件。

编辑

通过在注释中的额外信息去,

df1$pattern1.match <- as.numeric(df1$Genes %in% df2$Genes) 

应该实现你在找什么。

+0

所以我df1-主要数据框,我想检查int df1 $ pattern.match列哪些基因可以在df2中找到...基本上df2中的基因包含在df1中,我想检查通过将df1 $ pattern.match的元素标记为1,当在df2 – agatha

+0

中找到基因时,该模式。计数列只有元素= 1,因为它已经从另一个数据集中提取出来了 – agatha

+0

好的,现在有一个更好的解决方案可以解决问题。 – James

0

你的样本数据是不够的,玩的,但这里是我将开始:

dfm <- merge(df1, df2, by = idcol, all = TRUE) 
dfm_pc <- subset(dfm, Pattern.Count == 1) 

我把“idcol”从你的代码,没有看到它的数据。

+0

col = ncol(df1),因为我想更新df1 $ pattern1.match中df2..like标记的最后一列,哪个基因可以在df2中找到... – agatha