针对长数据框的所有组的散点图

drm*_*iod 4 r ggplot2 dplyr tidyr

我很确定已经有人问过类似的问题,但我不知道如何搜索它。

我经常获取宽格式的数据,就像我的 3 个实验 (ac) 的小例子一样。我通常转换为长格式并通过某些函数转换值(此处log2作为示例)。

我经常想做的是将所有实验相互对比,在这里我正在寻找一个方便的解决方案。如何转换我的数据框以获取构面,例如使用a~b,a~cb~c...

到目前为止,我tidy::spread再次输入数据并执行 3 次ggplot命令,其中各个列名称为xy。后来我将各个图表合并在一起。

有没有更方便的方法呢?

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)) 
Run Code Online (Sandbox Code Playgroud)

编辑
因为我从@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)
Run Code Online (Sandbox Code Playgroud)

hdk*_*rgr 5

从长格式开始的一种方法是对长数据进行自连接,以获得每行中两个实验的所有组合:

df %>%
    tidyr::gather(experiment, value, -names) %>%
    mutate(log2.value=log2(value)) %>%
    inner_join(., ., by=c("names")) %>% 
    ggplot(aes(log2.value.x, log2.value.y)) + geom_point() + facet_grid(experiment.y ~ experiment.x)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:为了避免绘制冗余的实验对,您可以执行以下操作:

df %>%
    tidyr::gather(experiment, value, -names) %>%
    mutate(log2.value=log2(value)) %>% inner_join(., ., by=c("names")) %>% 
    filter(experiment.x < experiment.y) %>% 
    ggplot(aes(log2.value.x, log2.value.y)) + geom_point() + facet_wrap(~experiment.y + experiment.x)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述