2016-02-11 78 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