Это может быть дубликат, но ни один из найденных мной вопросов, похоже, не помогает в моем случае.
У меня есть фрейм данных finaldf
, который содержит значения в разные моменты времени, и определенные моменты времени используются как разрывы оси X (соответствующие последовательности ДНК). Я получаю это так:
myseq <- "AGAATATTATACATTCATCT"
set.seed(123)
mydata <- data.frame(time=1:100, value=rnorm(100, mean=10, sd=2))
indices <- seq(5, 100, length.out=20)
seqsplit <- unlist(strsplit(myseq, ""))
ind_df <- data.frame(call=seqsplit, time=indices)
finaldf <- dplyr::left_join(mydata, ind_df, by = "time")
Это выглядит так:
> finaldf
time value call
1 1 8.879049 <NA>
2 2 9.539645 <NA>
3 3 13.117417 <NA>
4 4 10.141017 <NA>
5 5 10.258575 A
6 6 13.430130 <NA>
7 7 10.921832 <NA>
8 8 7.469878 <NA>
9 9 8.626294 <NA>
10 10 9.108676 G
11 11 12.448164 <NA>
12 12 10.719628 <NA>
13 13 10.801543 <NA>
14 14 10.221365 <NA>
15 15 8.888318 A
...
И я планирую это так:
P <- ggplot2::ggplot(finaldf, ggplot2::aes(x=time, y=value)) +
ggplot2::geom_line(linewidth=0.5) +
ggplot2::scale_x_continuous(breaks=indices, labels=seqsplit) +
ggplot2::theme_light()
grDevices::pdf(file = "test.pdf", height=4, width=10)
print(P)
grDevices::dev.off()
Результат этого сюжета:
Теперь я хочу ввести в последовательность различные пробелы и получить «графики с пробелами», идентичные приведенному выше, но с пробелами.
Моей отправной точкой были бы исходная finaldf
и различные последовательности с пробелами, идентичные исходной последовательности, но с пробелами. Например:
gapseq1 <- "AGAA-TAT--TAT-ACATT---CATCT-"
gapseq2 <- "A-G-AATAT----TATACATTCA-TCT"
Для этих двух последовательностей с пробелами я хочу воссоздать следующие графики (в идеале с сохранением сетки, но это не обязательно):
Как я могу сделать это простым способом? Спасибо!
В этом вся суть вопроса... моя отправная точка - это данные только для неразрывной последовательности, а затем разные версии последовательности с пробелами. Цель — «завершить» данные, добавив недостающие точки для пробелов.
Просто удалите значения, если вам не нужна какая-либо точка:
finaldf$value[rep(seqsplit == "-", each = 5)] <- NA
Я получаю следующую ошибку при попытке finaldf$value[rep(seqsplit == "-", each = 5)] <- NA
на seqsplit пробела gpseq1: replacement has 140 rows, data has 100
да, это потому, что ваш Gapseq1 длиннее исходного myseq.
Используйте gregexpr
, чтобы найти индексы каждого «-» в последовательности пробелов, и add_row
, чтобы добавить строки в фрейм данных, используя эти индексы.
library(tibble)
(idx <- 5 * (gregexpr("-", gapseq1)[[1]]) - 2)
for(i in idx)
finaldf <- finaldf |> add_row(value=rep(NA, 5), .before=i)
finaldf$time <- 1:nrow(finaldf)
indices <- seq(5, nrow(finaldf), 5)
labels <- unlist(strsplit(gapseq1, ""))
ggplot2::ggplot(finaldf, ggplot2::aes(x=time, y=value)) +
ggplot2::geom_line(linewidth=0.5) +
ggplot2::scale_x_continuous(breaks=indices, labels=labels) +
ggplot2::theme_light()
Вот оно! Спасибо @Edward, ты сегодня дважды спас мне жизнь.
Пожалуйста, предоставьте полные данные теста, используя
dput
. На данный момент ваши последовательности с пробелами имеют длину, отличную от вашего фрейма данных. Решением, скорее всего, будет введение индикаторной переменной для индексации «непропускных» частей ваших последовательностей, а затем использование ее в сочетании сgroup = 1
для определения соответствующейaes
тетики. [Являются лиgapseq1
иgapseq2
заменой для столбцаcall
в ваших тестовых данных?]