Есть ли способ создать диаграмму рассеяния, используя ggplot2 из таблицы со всеми значениями в одном столбце без pivot_wider? - PullRequest
2 голосов
/ 16 марта 2020

У меня есть фрейм данных с тремя столбцами:

sampleData <- structure(list(sgRNA = c("SFPQ_9", "SFPQ_9", "FBXO18_13", "FBXO18_13", 
                         "DDX21_55", "DDX21_55", "TAF6L_11", "TAF6L_11", "NAA40_3", "NAA40_3", 
                         "KDM5A_1", "KDM5A_1", "DGKH_17", "DGKH_17", "NAA30_15", "NAA30_15", 
                         "HMG20A_8", "HMG20A_8", "CASKIN1_35", "CASKIN1_35", "NUBP1_20", 
                         "NUBP1_20", "CTCF_9", "CTCF_9", "THAP11_17", "THAP11_17", "EZH1_9", 
                         "EZH1_9", "SMARCD2_21", "SMARCD2_21", "E2F6_6", "E2F6_6", "CENPA_11", 
                         "CENPA_11", "SP140_35", "SP140_35", "SETD4_3", "SETD4_3", "STAG3_9", 
                         "STAG3_9", "RAD54B_39", "RAD54B_39", "SMC1A_59", "SMC1A_59", 
                         "ZNF257_1246", "ZNF257_1246", "DYNC1I2_4", "DYNC1I2_4", "NTC_77", 
                         "NTC_77"), replicate = c("R1", "R2", "R1", "R2", "R1", "R2", 
                                                  "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", 
                                                  "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", 
                                                  "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", 
                                                  "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2", "R1", "R2"
                         ), abundance = c(450L, 583L, 209L, 231L, 212L, 288L, 958L, 1103L, 
                                          562L, 717L, 388L, 452L, 290L, 330L, 201L, 281L, 142L, 258L, 608L, 
                                          850L, 218L, 328L, 522L, 711L, 623L, 772L, 371L, 471L, 56L, 52L, 
                                          160L, 135L, 359L, 416L, 213L, 348L, 301L, 416L, 185L, 256L, 222L, 
                                          238L, 347L, 536L, 765L, 973L, 115L, 117L, 102L, 132L)), row.names = c(NA, 
                                                                                                                -50L), class = c("tbl_df", "tbl", "data.frame"))

Я хотел бы построить диаграмму рассеяния. Все значения находятся в столбце «обилие», а «репликация» указывает, следует ли использовать наблюдение в качестве координаты по оси x или y. В то время как «sgRNA» указывает точку. Я понимаю, что могу повернуть данные в более широкий формат, чтобы сгенерировать два новых столбца «R1» и «R2» и построить их друг против друга с помощью ggplot2, но есть ли способ сделать это без поворота?

Ответы [ 4 ]

2 голосов
/ 16 марта 2020

Иногда я не думаю, что речь идет о написании дополнительного кода, но больше о воспроизводимости и понимании того, что было сделано, для себя на дороге или для кого-то еще, пытающегося понять, что вы сделали.

Это ниже работает, но эй не самый интуитивный:

ggplot(data.frame(split(sampleData$abundance,sampleData$replicate)),
aes(x=R1,y=R2)) + geom_point()

enter image description here

2 голосов
/ 16 марта 2020

Я согласен с @ www's комментарием. Непонятно , почему вы не хотите поворачиваться.

В ответ на ваш вопрос: Нет, вам нужно будет изменить данные так или иначе.

Если вам не нравится pivot_wider, вы можете использовать xtabs с as.data.frame.matrix следующим образом:

ggplot(as.data.frame.matrix(xtabs(abundance ~ ., data = sampleData)), aes(R1, R2)) + 
    geom_point()

enter image description here

Но это все еще видоизменяется от длинного к широкому.

1 голос
/ 16 марта 2020

Я предполагаю, что в некоторых редких случаях, например, если вы используете компьютер компании, к которому у вас нет доступа к tidyr, может работать следующее, которое использует только dplyr и ggplot2.

library(dplyr)
library(ggplot2)

R1 <- sampleData %>% filter(replicate %in% "R1") %>% select(-replicate) 
R2 <- sampleData %>% filter(replicate %in% "R2") %>% select(-replicate)
R1R2 <- R1 %>% left_join(R2, by = "sgRNA", suffix = c("_R1", "_R2"))

ggplot(R1R2, aes(x = abundance_R1, y = abundance_R2)) +
  geom_point()

enter image description here

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

Они не используют tidyr, но конвертируют данные в широкую форму, используя другие методы:

1) Считайте sampleData в объект зоопарка, разбивающийся на второй столбец, преобразуйте это к фрейму данных (который будет иметь столбцы R1 и R2) и использовать qplot из ggplot2:

library(ggplot2)
library(magrittr)
library(zoo)

sampleData %>%
  read.zoo(split = 2, FUN = c) %>%
  as.data.frame %$%
  qplot(R1, R2)

screenshot

2) Другой подход, дающий тот же результат, заключается в использовании tapply:

library(ggplot2)
library(magrittr)

sampleData %$%
  tapply(.[[3]], .[-3], c) %>%
  as.data.frame.matrix %$% 
  qplot(R1, R2)

Это также может быть написано без magrittr, например:

library(ggplot2)

with(as.data.frame.matrix(tapply(sampleData[[3]], sampleData[-3], c)),
  qplot(R1, R2))
...