2013-05-07 57 views
1

合併兩個二進制data.frames我有兩個data.frames看起來像:根據值

df1 
    Gene name sample1 sample2 sample3  sample4  sample5 
    A    0   1   0   0   1 
    B    1   0   0   1   0 
    C    0   0   1   1   1 
    D    1   0   0   1   0 



df_final 
    Gene name sample1 sample2 sample3  sample4  sample5 
    A    1   1   1   0   0 
    B    0   1   0   0   0 
    C    1   1   0   0   0 
    D    1   1   0   0   0 

「0」 和 「1」 只存在值。我想要一個data.frame,其中當 在df1或df2中的條目在兩個data.frame中都是== 1時,它將保持爲「1」(與「0」相同)。否則,當它在一個data.frame(例如df1)中爲== 1並且在其他data.frame(例如df2)中爲0時,該條目將變爲1.兩個data.frames具有相同的行數並且相同數量的列。

所需的輸出將是:

df1 
    Gene name sample1 sample2 sample3  sample4  sample5 
    A    1   1   1   0   1 
    B    1   1   0   1   0 
    C    1   1   1   1   1 
    D    1   1   0   1   0 

由於我是在RI新想用的for循環在所述第一和第二data.frame 學習循環在多個數據.frames。目前我無法做這樣的工作。 任何人都可以幫助我嗎?

最佳,

E.

+0

這兩個數據框的行數是否相同,每個基因一個? – joran 2013-05-07 19:01:47

+0

是的!相同的行數和相同的列數!我很快編輯! – Elb 2013-05-07 19:02:51

回答

1

短道:#df3 <- as.integer(df1+df2>0)#這是錯誤的

編輯短道:df3 <- apply(df1+df2>0, c(1,2), as.integer) #there可能是短

隨着循環等:

df3 <- as.data.frame(matrix(rep(NA, nrow(df1)*ncol(df1)),ncol=ncol(df1)) 
names(df3) <- names(df1) 

for(i in 1:ncol(df1)){ 
    for(j in 1:nrow(df1)){ 
    if(i==1){#edited 
     df3[j,i] <- df1[j,i]#edited; note, this is dangerous b/c it is assuming the data frames are organized in the same way 
    }else{#edited 
     df3[j,i] <- as.integer((df1[j,i] + df2[j,i])>0) 
    }#edited 
    } 
} 

這項工作?

+0

是的!完善!萬分感謝! – Elb 2013-05-07 22:07:30

+1

你的短路很有點誤導。正如OP所述,您不能簡單地添加整個數據幀。其中兩列是字符,這會導致錯誤。此外,在這種情況下,'as.integer'將會減少維度,導致只是一個向量,而不是數據幀。 – joran 2013-05-07 22:09:05

+0

@joran +1感謝您的意見。我做了編輯。 – rbatt 2013-05-08 06:08:35

3

的 「R」 的方式做這樣的事情是採取量化的優勢:

df3 <- df1 
> df3[,-1] <- ((df1[,-1] + df2[,-1]) > 0) + 0 
> df3 
    Genename sample1 sample2 sample3 sample4 sample5 
1  A  1  1  1  0  1 
2  B  1  1  0  1  0 
3  C  1  1  1  1  1 
4  D  1  1  0  1  0 

的循環仍在發生,但根據引擎蓋,在更快的編譯代碼。

的簡要說明:

我們可以添加兩個數據幀的數字部分以量化的方式:

(df1[,-1] + df2[,-1]) 
    sample1 sample2 sample3 sample4 sample5 
1  1  2  1  0  1 
2  1  1  0  1  0 
3  1  1  1  1  1 
4  2  1  0  1  0 

然後,如果我們問其值大於零,我們得到「正確「的答案,但在布爾值,而不是0和1:

> (df1[,-1] + df2[,-1]) > 0 
    sample1 sample2 sample3 sample4 sample5 
[1,] TRUE TRUE TRUE FALSE TRUE 
[2,] TRUE TRUE FALSE TRUE FALSE 
[3,] TRUE TRUE TRUE TRUE TRUE 
[4,] TRUE TRUE FALSE TRUE FALSE 

幸運的是,如果我們簡單地添加0,R將要挾布爾回整數:

> ((df1[,-1] + df2[,-1]) > 0) + 0 
    sample1 sample2 sample3 sample4 sample5 
[1,]  1  1  1  0  1 
[2,]  1  1  0  1  0 
[3,]  1  1  1  1  1 
[4,]  1  1  0  1  0 
+0

哦!只是一個簡單的總和!太棒了!萬分感謝! – Elb 2013-05-07 19:13:53

+0

偉大的古蘭經,特別是對於解釋! – Elb 2013-05-07 19:16:03

3

你想要的是被稱爲按位或運算:https://en.wikipedia.org/wiki/Bitwise_operation#OR

有在R 3.0位運算功能:bitwAnd,bitwNot,bitwOr,bitwShiftL,bitwShiftR和bitwXor(bitwOr是你正在尋找一個)。

答案喬蘭給了很好的作品,但如果你正在運行R 3。0我建議使用按位運算,因爲它們往往工作得更快:

> system.time(for (i in 1:10000) {df3[,-1] <- ((df1[,-1] + df2[,-1]) > 0) + 0}) 
    user system elapsed 
    13.58 0.00 13.59 

> system.time(for (i in 1:10000) {df3[,-1] = bitwOr(unlist(df1[,-1]), unlist(df2[,-1]))}) 
    user system elapsed 
    5.44 0.00 5.45 
+1

命令'bitwOr'從哪裏來?我知道'bitOr'庫'bitops',但是有另一個包處理按位操作? (+1使用位操作,但我認爲'unlist'命令不需要......) – 2013-05-08 05:47:42

+0

它們位於基本包中,但看起來它們在R 3.0中是新的(我以前沒有注意到它)。我不得不使用unlist,因爲函數只將向量作爲參數,所以它不起作用。 http://stat.ethz.ch/R-manual/R-devel/library/base/html/bitwise.html – 2013-05-08 15:32:16