我一直在寻找相当长的时间来找到解决该问题的优雅方法,但无济于事。所以我决定在这里试一试。
我正在使用tidyverse
和gather
函数将包含来自不同样本的强度值的矩阵转换为长格式,以准备使用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软件包。有谁知道实现这一目标的优雅方法?
答案 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