【发布时间】:2021-01-24 23:21:04
【问题描述】:
我有两个数据框。计算从 t1 到 t2 的百分比变化很容易,如下所示:
t1 <- data.frame("gene1" = c(1,5,10), "gene2" = c(1,1,1), "gene3" = c(5,5,20))
row.names(t1) <- c("patient1", "patient2", "patient3")
t2 <- data.frame("gene1" = c(0.5,5,20), "gene2" = c(2,4,8), "gene3" = c(2.5,20,5))
row.names(t2) <- c("patient1", "patient2", "patient3")
t3 <- (t2-t1)/t1 *100
t3
#> gene1 gene2 gene3
#> patient1 -50 100 -50
#> patient2 0 300 300
#> patient3 100 700 -75
但是如果我想做对称百分比变化,这样从 20 到 5 的值变化不会是 -75,而是 -300。我试过这个:
t3 <- ifelse(t2 > t1, ((t2-t1)/t1) * 100, ((t2-t1)/t2) * 100)
但这给了我一些奇怪的 3x9 列表。
原则上使用 ifelse 应该可以。如果我降低复杂性,那么它工作得很好
t3 <- ifelse(t2 > t1, "a", "b")
t3
#> gene1 gene2 gene3
#> patient1 b a b
#> patient2 b a a
#> patient3 a a b
理想情况下我的输出是:
t3
#> gene1 gene2 gene3
#> patient1 -100 100 -100
#> patient2 0 300 300
#> patient3 100 700 -300
【问题讨论】:
-
要明确一点:
-100(t3中的 1、1)表示该值减少了后来值的 100%(从 1 减少到 0,5),对吗? -
@David:是的,没错
-
这是否意味着对于基因 1,患者 3,变化将是 50 (=
(20 - 10) / 20 * 100),而不是您在预期输出中输入的 100? -
@David:通过非对称计算,是的。但我有兴趣以对称方式做:ifelse(t2 > t1, ((t2-t1)/t1) * 100, ((t2-t1)/t2) * 100)
标签: r dataframe if-statement math percentage