Tidyverse收集来自其他数据帧的行数据

时间:2018-10-05 14:28:03

标签: r dplyr tidyr

我一直在寻找相当长的时间来找到解决该问题的优雅方法,但无济于事。所以我决定在这里试一试。

我正在使用tidyversegather函数将包含来自不同样本的强度值的矩阵转换为长格式,以准备使用ggplot进行绘图。

有两种类型的注释。对应于基因的数据的“基于行”的注释,对应于样本信息的“基于列”的注释。基于列的信息存储在单独的数据框中。

使用gather可以很容易地将值和基于行的注释准备为长格式。

> df <- data.frame(annot=c("A", "B", "C", "D"), sample1=c(1,1,4,2), sample2=c(3,5,4,5))
> df
  annot sample1 sample2
1     A       1       3
2     B       1       5
3     C       4       4
4     D       2       5
> df %>% gather(sample, value, -annot)
  annot  sample value
1     A sample1     1
2     B sample1     1
3     C sample1     4
4     D sample1     2
5     A sample2     3
6     B sample2     5
7     C sample2     4
8     D sample2     5

样本信息比较棘手。它存储在单独的数据框中:

> sample_info <- data.frame(sample=c("sample1", "sample2"), condition=c("infected", "uninfected"))
> sample_info
   sample  condition
1 sample1   infected
2 sample2 uninfected

所需的最终结果如下所示:

  annot  sample value condition
1     A sample1     1 infected
2     B sample1     1 infected
3     C sample1     4 infected
4     D sample1     2 infected
5     A sample2     3 uninfected
6     B sample2     5 uninfected
7     C sample2     4 uninfected
8     D sample2     5 uninfected

我能够通过对数据帧进行后处理来实现这一点,在生成长数据帧后,我将样本名称逐行映射到条件。我正在寻找一种更整洁的解决方案,最好使用tidyverse软件包。有谁知道实现这一目标的优雅方法?

1 个答案:

答案 0 :(得分:2)

*_join中的dplyr函数(已加载tidyverse)非常适合解决涉及多个数据帧的许多问题。

> df %>%
      gather(sample, value, -annot) %>%
      left_join(sample_info, by = 'sample')

  annot  sample value  condition
1     A sample1     1   infected
2     B sample1     1   infected
3     C sample1     4   infected
4     D sample1     2   infected
5     A sample2     3 uninfected
6     B sample2     5 uninfected
7     C sample2     4 uninfected
8     D sample2     5 uninfected