Сгруппируйте R-фрейм данных по геномным c координатам, чтобы построить среднее покрытие на основе - PullRequest
0 голосов
/ 23 марта 2020

Я хотел бы построить график среднего охвата области генома для каждой базы по разным образцам: я хотел бы изобразить положение каждого генома c на оси x и среднее покрытие его на оси y.

У меня есть этот файл: где в первом столбце указана область генома c, а во втором столбце указано среднее покрытие по разным образцам.

12:36761802-36761804 54
12:36761802-36761805 42
12:36761802-36761806 56.5
12:36761802-36761810 28.75
12:36761803-36761804 29
12:36761803-36761806 30

Как видите, строки перекрываются, поэтому Я не уверен, как я мог построить это.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Очень похоже на Аллана, но немного отличается:

  • Использование ширины сегмента для обозначения среднего покрытия.
  • Нумерация выборок и использование ее в качестве оси y
library("dplyr")
library("tidyr")
library("ggplot2")           

# Your data - thanks Allan
df <- structure(list(region = c("36761802-36761804", "36761802-36761805", 
                                "36761802-36761806", "36761802-36761810", "36761803-36761804", 
                                "36761803-36761806"), mean = c(54, 42, 56.5, 28.75, 29, 30)), 
                class = "data.frame", row.names = c(NA, -6L))



df <- df %>%
  mutate(sample = factor(1:n())) %>%
  separate(region, into = c("rstart", "rend"))

ggplot(df) +
  geom_segment(aes(x = rstart, xend = rend, 
                   y = sample, yend = sample,
                   size = mean, color = mean)) +
  scale_size(guide = "none")

Создано в 2020-03-23 ​​ представьте пакет (v0.3.0)

0 голосов
/ 23 марта 2020

Вы можете построить диапазоны в виде отрезков:

library(ggplot2)

df$region_start <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 1)))
df$region_end <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 2)))

ggplot(df, aes(x = region_start, y = mean, colour = region)) + 
  geom_segment(aes(xend = region_end, yend = mean), size = 1.5) +
  labs(x = "locus")

enter image description here


РЕДАКТИРОВАТЬ

После дальнейшего уточнения из OP, это среднее значение в каждой точке, которое должно быть нанесено на график. Это немного сложнее, но может быть сделано в несколько строк с помощью dplyr

library(ggplot2)
library(dplyr)

df$region_start <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 1)))
df$region_end <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 2)))
do.call("rbind", mapply(function(x, y, z) cbind(x:y, rep(z, 1 + y - x)),
                        df$region_start, 
                        df$region_end, 
                        df$mean)) %>%
  as.data.frame()                 %>%
  setNames(c("Locus", "Value"))   %>%
  group_by(Locus)                 %>%
  summarise(mean = mean(Value))   %>%
  ggplot(aes(x = Locus, y = mean)) + 
  geom_line() + labs(x = "Locus")

enter image description here

Используемые данные:

           region  mean
36761802-36761804    54
36761802-36761805    42
36761802-36761806  56.5
36761802-36761810 28.75
36761803-36761804    29
36761803-36761806    30

Представляет:

df <- structure(list(region = c("36761802-36761804", "36761802-36761805", 
                "36761802-36761806", "36761802-36761810", "36761803-36761804", 
                "36761803-36761806"), mean = c(54, 42, 56.5, 28.75, 29, 30)), 
                class = "data.frame", row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...