Как построить несколько временных рядов? [Дубликат]

На самом деле sed -n '/pattern/{n;p}' filename выйдет из строя, если pattern соответствует continuous линиям:

$ seq 15 |sed -n '/1/{n;p}'
2
11
13
15

Ожидаемые ответы должны быть:

2
11
12
13
14
15

Мое решение:

$ sed -n -r 'x;/_/{x;p;x};x;/pattern/!s/.*//;/pattern/s/.*/_/;h' filename

Например:

$ seq 15 |sed -n -r 'x;/_/{x;p;x};x;/1/!s/.*//;/1/s/.*/_/;h'
2
11
12
13
14
15

Объясняет:

  1. x;: в начале каждой строки из ввода используйте x для обмена содержимым в pattern space & amp; hold space.
  2. /_/{x;p;x};: если pattern space, который фактически является hold space, содержит _ (это только indicator, указывающий, соответствует ли последняя строка pattern или not), затем используйте x для обмена фактическим содержимым current line на pattern space, используйте p для печати current line и x для восстановления этой операции.
  3. x: восстановить содержимое в pattern space и hold space.
  4. /pattern/!s/.*//: если current line НЕ соответствует pattern, это означает, что мы НЕ должны напечатайте следующую строку ниже, затем используйте команду s/.*//, чтобы удалить все содержимое в pattern space.
  5. /pattern/s/.*/_/: если current line соответствует pattern, это означает, что мы должны напечатать следующую строку ниже , тогда нам нужно установить indicator, чтобы сообщить sed распечатать строку NEXT, поэтому используйте s/.*/_/, чтобы заменить все содержимое в pattern space на _ (вторая команда будет использовать его, чтобы судить, если последняя строка соответствует pattern или нет).
  6. h: перезаписать hold space с содержимым в pattern space; то содержание в hold space равно ^_$, что означает, что current line соответствует pattern или ^$, что означает, что current line НЕ соответствует pattern.
  7. пятый шаг и шестой шаг не могут быть обменены, потому что после s/.*/_/, pattern space НЕ МОЖЕТ соответствовать /pattern/, поэтому s/.*// ДОЛЖЕН быть выполнен!
17
задан user1723765 11 November 2012 в 16:24
поделиться

1 ответ

Если ваши данные называются df примерно так:

library(ggplot2)
library(reshape2)
meltdf <- melt(df,id="Year")
ggplot(meltdf,aes(x=Year,y=value,colour=variable,group=variable)) + geom_line()

enter image description here [/g0]

Так что в основном в моем коде, когда я использую aes() Im говорит, что ось x Year, ось y value, а затем colour / grouping находится на variable.

Функция melt() была для получения ваших данных в формате ggplot2. Один большой столбец для year и т. Д., Который вы тогда эффективно разделяете, когда вы рассказываете об этом по отдельным строкам для вашего variable.

32
ответ дан user1317221_G 21 August 2018 в 23:54
поделиться
  • 1
    по какой-то причине я получаю следующую ошибку: Ошибка в eval (expr, envir, enc): объект «Год» не найден, и до этого, когда я добавил команду melt (), он сказал: & gt; meltdf = расплав (c.o) Использование в качестве переменных id – user1723765 10 November 2012 в 20:47
  • 2
    также есть ли способ заставить линии выглядеть «лучше»? эти резкие прыжки выглядят немного похожими на доверительные интервалы ... может ли это быть немного более непрерывным? – user1723765 10 November 2012 в 21:00
  • 3
    – user1317221_G 10 November 2012 в 22:56
  • 4
    Я пропустил что-то в коде, который вы должны использовать meltdf<-melt(df,id="Year"). Я тоже исправил это. – user1317221_G 11 November 2012 в 12:04
  • 5
    Или вы можете использовать geom_smooth, возможно, в комбинации с geom_point, чтобы получить более плавный график. – Paul Hiemstra 11 November 2012 в 12:45
Другие вопросы по тегам:

Похожие вопросы: