【发布时间】:2019-08-30 16:46:53
【问题描述】:
我很确定已经有人问过这样的问题,但我不知道如何搜索。
我经常获取宽格式的数据,例如我的小示例中的 3 个实验 (a-c)。我通常转换为长格式并通过某些函数转换值(这里以log2 为例)。
我经常想做的是将所有实验相互对照,在这里我正在寻找一个方便的解决方案。如何转换我的数据框以获取构面,例如 a~b、a~c 和 b~c...
到目前为止,我再次tidy::spread 数据并执行3 次ggplot 命令,其中各个列的名称分别为x 和y。稍后我将各个图合并在一起。
有没有更方便的方法?
library(dplyr)
library(tidyr)
library(ggplot2)
df <- data.frame(
names=letters,
a=1:26,
b=1:13,
c=11:36
)
df %>%
tidyr::gather(experiment, value, -names) %>%
mutate(log2.value=log2(value))
编辑
因为我从@hdkrgr 得到了一个非常有用的答案,所以我修改了一些代码。 inner_join 是一个很棒的技巧,我可以实现它来自动化我的想法,我仍然想念的是一个聪明的过滤器来摆脱冗余数据,因为如果我不想绘制 c~c 或 b~a已经绘制a~b。
我现在通过提供我想做的配对解决了这个问题,但是有人能想到一个直接的解决方案吗?我想不出有什么东西可以给我独特的配对。
my_pairs <- c('a vs. b', 'a vs. c', 'b vs. c')
df %>%
as_tibble() %>%
tidyr::gather(experiment, value, -names) %>%
mutate(log2.value=log2(value)) %>%
inner_join(., ., by=c("names")) %>%
mutate(pairing=sprintf('%s vs. %s', experiment.x, experiment.y)) %>%
filter(pairing %in% my_pairs) %>%
ggplot(aes(log2.value.x, log2.value.y)) +
geom_point() +
facet_wrap( ~ pairing, labeller=label_both)
【问题讨论】:
-
查看 ggplot 中的
facet_wrap和facet_grid。当数据为长格式时,这些通常最有效。 -
我知道这些功能,但不知道如何使用它们,因为
x和y在同一列中。你能用我的变异长数据框发布一个例子吗? -
啊...我想我现在才明白你真正想要做什么。我会发布一个答案,虽然它比我想要的要复杂一些......