Tidyverse собрать с rowdata из другого фрейма данных - PullRequest
0 голосов
/ 05 октября 2018

Я довольно долго искал элегантное решение этой проблемы, но безрезультатно.Поэтому я решил попробовать.

Я использую 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.Кто-нибудь знает элегантный способ добиться этого?

1 Ответ

0 голосов
/ 05 октября 2018

Функции *_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
...