2016-02-11 75 views
2

比方說,我有這樣的熔融data.frame如何歸零熔融數據幀?

molten <- data.frame(
    gene = c("a1", "b1", "a1", "b1", "a1", "b1"), 
    count = c(3, 4, 5, 2, 6, 7), 
    condition = c("A", "A", "B", "B", "C", "C") 
) 
# gene count condition 
# 1 a1  3   A 
# 2 b1  4   A 
# 3 a1  5   B 
# 4 b1  2   B 
# 5 a1  6   C 
# 6 b1  7   C 

它看起來像這樣未熔

molten %>% 
    dcast(gene ~ condition, value.var = "count") 
# gene A B C 
# 1 a1 3 5 6 
# 2 b1 4 2 7 

如何從所有其它數值列減去列A(B和C在這個例子中) 。我希望最終輸出能夠融化,但是我不知道這是否可以直接完成,或者如果我必須解開,減去然後融化。最終的輸出應該是這樣的:

# gene A B C 
# 1 a1 0 2 3 
# 2 b1 0 -2 3 

更新:

我也有興趣在一個更復雜的情況:

molten <- data.frame(
    gene = c("a1", "b1", "a1", "b1", "a1", "b1"), 
    count = c(3, 4, 5, 2, 6, 7), 
    condition = c("A", "A", "B", "B", "C", "C"), 
    day = c(0, 0, 1, 1, 2, 2) 
) 

通過@ eipi10提出的解決方案提供了一個錯誤:

molten %>% 
    group_by(gene, condition) %>% 
    mutate(count = count - count[day == 0]) 
Error: incompatible size (0), expecting 1 (the group size) or 1 

這是我的解決方法:

x <- list(a1 = 3, b1 = 4) 
molten %>% 
    group_by(gene, condition) %>% 
    mutate(count = count - x[[gene]]) 

回答

2
library(dplyr) 

molten %>% group_by(gene) %>% 
    mutate(count = count - count[condition=="A"]) 

    gene count condition 
    (fctr) (dbl) (fctr) 
1  a1  0   A 
2  b1  0   A 
3  a1  2   B 
4  b1 -2   B 
5  a1  3   C 
6  b1  3   C 

UPDATE:爲了回答您的評論,在你的第二個例子,你按genecondition。然後,您想要爲day==0減去count的值。但day只有當condition=="A"等於零。對於condition「B」或「C」,從來沒有一行在哪裏day==0。下面是在我們做的子集自己的例子會發生什麼:

m = molten 

x = m$count[m$gene=="a1" & m$condition=="B"] 

x
[1] 5

y = m$count[m$gene=="a1" & m$condition=="B" & m$condition=="A"] 

y
numeric(0)

numeric(0)是零長度的數值向量。由於x=5y=numeric(0)以及我們想要x - y,我們要求R返回5 - numeric(0)的結果。

5 - numeric(0)  

numeric(0)

length(numeric(0)) 

[1] 0

mutate期待計算返回長度等於任一行的組中的(1在這種情況下)號碼或1的矢量,但長度返回值爲零,導致錯誤。

我不知道是什麼原因5 - numeric(0)回報numeric(0)同時,例如,sum(numeric(0), 5)回報5.也許有一個很好的理由,也許它只是保持設計的程序員在他們的腳趾那些迷人的怪癖之一。無論如何,這裏的錯誤是很好的,因爲它幫助我們意識到,當condition != "A"實際上沒有價值減去,並且我們的代碼因此沒有做我們認爲的那樣。

+0

這麼簡單,謝謝! – nachocab

+0

我使用更復雜的輸入矩陣出現錯誤(請參閱更新後的問題)。你能幫我理解我爲什麼得到它或如何解決它嗎? – nachocab

+0

查看更新的答案。 – eipi10

1
require(reshape2) 
require(magrittr) 

subtract_num <- function(x, colname){ 
    ind = which(sapply(x, is.numeric)) 
    x[ind] = sapply(x[ind], subtract, x[colname]) 
    x 
} 

molten %>% 
    dcast(gene ~ condition, value.var = "count") %>% 
    subtract_num("A") 

結果:

gene A B C 
1 a1 0 2 3 
2 b1 0 -2 3 

P.S:像我接縫了解所需的輸出比@非常不同eipi10

+0

OP說他希望最終的輸出是融化的,所以我保持它的長格式。此外,它看起來像你需要修復列名稱。 – eipi10

+0

@ eipi10,thx:固定名稱。讓我們看看他接受哪一個;) – Rentrop

+0

謝謝你們兩個,我選擇了@ eipi10的回答,因爲它阻止了我不得不再次融化和融化 – nachocab