如何对熔融数据帧进行零标准化?

时间:2016-02-11 21:04:09

标签: r dataframe melt

让我说我有这个熔化的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

看起来像这个unmolten

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

如何从所有其他数字列(本例中为B和C)中减去A列。我希望最终输出是熔化的,但我不知道这是否可以直接完成,或者我是否必须解开,减去然后融化。最终输出应如下所示:

#   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 个答案:

答案 0 :(得分: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

更新:要回答您的评论,请在第二个示例中按genecondition进行分组。然后,您要为count减去day==0的值。但day仅在condition=="A"时等于零。对于condition&#34; B&#34;或&#34; C&#34;从来没有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"]
  

ÿ
  数字(0)

numeric(0)是长度为零的数字向量。由于x=5y=numeric(0)以及我们想要x - y,我们已经要求R返回5 - numeric(0)的结果。

5 - numeric(0)    
  

数字(0)

length(numeric(0))
  

[1] 0

mutate期望计算返回一个长度等于组中行数(本例中为1)或1的向量,但返回值的长度为零,导致错误

我不完全确定为什么5 - numeric(0)会返回numeric(0),而sum(numeric(0), 5)会返回5.例如,这可能是有充分理由的,或者可能是&# #39; s只是其中一个使R程序员保持警惕的迷人怪癖。在任何情况下,这里的错误都很好,因为它有助于我们意识到在condition != "A"时实际上没有值可以减去,而且我们的代码因此没有按照我们的想法进行。

答案 1 :(得分: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

非常不同