2011-10-03 94 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