r - 如何对熔化的数据帧进行零归一化?

标签 r dataframe melt

假设我有这个熔化的数据框

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]])

最佳答案

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

更新:为了回答您的评论,在第二个示例中,您按基因条件进行分组。然后您要减去 day==0count 值。但只有当 condition=="A" 时,day 才等于零。对于条件“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 - 数字(0)

5 - numeric(0)    

numeric(0)

length(numeric(0))

[1] 0

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

我不太确定为什么 5 - numeric(0) 返回 numeric(0) 而例如 sum(numeric(0), 5) 返回 5。也许这有一个很好的理由,或者也许这只是让 R 程序员保持警惕的迷人怪癖之一。无论如何,这里的错误是好的,因为它帮助我们认识到,当 condition != "A" 时,实际上没有任何值可以减去,因此我们的代码没有按照我们的想法去做。

关于r - 如何对熔化的数据帧进行零归一化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35349977/

相关文章:

r - 当计算相同时,为什么 R 会随着时间的推移而减慢?

r - 如何使用 R 格子 xyplot 根据数值阈值对点进行着色

python - 将多列中的行移动到各自的列中 Python

python - 如何为两列之间的所有日期添加行?

R - 熔化两个地址列并类型转换为新列

r - 如何查找数据框中特定列的哪一行具有最高值?

r - 求解 R 中混合模型方程的积分

python - 将 5D 数组转换为 Pandas 数据框的最有效方法

python - Pandas 合并并保留在右边并删除左边

python - 如何融化 Pandas 数据框?