如何对熔融数据帧进行零归一化?
How to zero-normalize a molten dataframe?
假设我有这个熔化的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]])
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
更新: 为了回答您的评论,在您的第二个示例中,您按 gene
和 condition
分组。然后你想减去 count
的值以获得 day==0
。但是 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=5
和 y=numeric(0)
并且我们想要 x - y
,我们要求 R return 5 - numeric(0)
.
的结果
5 - numeric(0)
numeric(0)
length(numeric(0))
[1] 0
mutate
期望计算 return 长度等于组中行数(在本例中为 1)或 1 的向量,但 returned 值为零,导致错误。
我不太清楚为什么 5 - numeric(0)
returns numeric(0)
while, example, sum(numeric(0), 5)
returns 5. 也许有一个很好的原因,或者这可能只是让 R 程序员保持警觉的迷人怪癖之一。无论如何,这里的错误是好的,因为它帮助我们意识到当 condition != "A"
时实际上没有要减去的值,因此我们的代码没有按照我们的想法去做。
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
非常不同
假设我有这个熔化的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]])
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
更新: 为了回答您的评论,在您的第二个示例中,您按 gene
和 condition
分组。然后你想减去 count
的值以获得 day==0
。但是 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=5
和 y=numeric(0)
并且我们想要 x - y
,我们要求 R return 5 - numeric(0)
.
5 - numeric(0)
numeric(0)
length(numeric(0))
[1] 0
mutate
期望计算 return 长度等于组中行数(在本例中为 1)或 1 的向量,但 returned 值为零,导致错误。
我不太清楚为什么 5 - numeric(0)
returns numeric(0)
while, example, sum(numeric(0), 5)
returns 5. 也许有一个很好的原因,或者这可能只是让 R 程序员保持警觉的迷人怪癖之一。无论如何,这里的错误是好的,因为它帮助我们意识到当 condition != "A"
时实际上没有要减去的值,因此我们的代码没有按照我们的想法去做。
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
非常不同