【问题标题】:How to zero-normalize a molten dataframe?如何对熔融数据帧进行零标准化?
【发布时间】:2016-05-22 20:34:51
【问题描述】:

假设我有这个熔化的 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

如何从所有其他数字列(本例中的 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]])

【问题讨论】:

    标签: r dataframe melt


    【解决方案1】:
    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 分组。然后你想用day==0 减去count 的值。但是只有当condition=="A"day 才等于0。对于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"]
    

    是的
    数字(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。也许这是有充分的理由,或者这只是让R 程序员坚持下去的迷人怪癖之一他们的脚趾。无论如何,这里的错误是好的,因为它帮助我们意识到当condition != "A" 时实际上没有任何价值可以减去,因此我们的代码没有按照我们的想法做。

    【讨论】:

    • 我在使用更复杂的输入矩阵时遇到错误(请参阅更新的问题)。你能帮我理解我为什么会得到它或如何解决它吗?
    • 有趣。感谢您的回答。您看到解决方法了吗?
    • 没关系。我添加了解决方法,如果您知道更好的方法,请告诉我
    【解决方案2】:
    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 非常不同

    【讨论】:

    • OP 说他希望最终输出是熔化的,所以我将其保留为长格式。此外,您似乎需要修复列名。
    • @eipi10,谢谢:修复了名称。让我们看看他接受哪一个;)
    • 谢谢你们,我选择了@eipi10 的答案,因为它让我不必再进行 dcast 和融化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2017-12-19
    • 2021-09-21
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多