Определите и нанесите точки данных в окружении NA - PullRequest
0 голосов
/ 28 сентября 2018

Я использую ggplot2 и geom_line(), чтобы создать линейный сюжет из большого количества временных рядов.Набор данных имеет большое количество пропущенных значений, и я в целом рад, что линии не прорисовываются на пропущенных сегментах, так как это выглядело бы странно.

Моя проблема в том, что отдельные точки данных не-NA окружены NA (илиточки в начале / конце ряда с NA на другой стороне) не наносятся.Потенциальным решением было бы добавить geom_point() для всех наблюдений, но это увеличит мой размер файла в десять раз и затруднит чтение графика.

Таким образом, Я хочу идентифицировать только те точки данных, которые не отображаются с geom_line(), и добавлять баллы только для этих .Есть ли простой способ идентифицировать эти точки?

Мои данные в настоящее время находятся в длинном формате, и следующие MWE могут служить иллюстрацией.Я хочу определить строки 1 и 7, чтобы я мог построить их:

library(ggplot2)
set.seed(1)
dat <- data.frame(time=rep(1:5,2),country=rep(1:2,each=5),value=rnorm(10))
dat[c(2,6,8),3] <- NA
ggplot(dat) + geom_line(aes(time,value,group=country))

> dat
   time country      value
1     1       1 -0.6264538
2     2       1         NA
3     3       1 -0.8356286
4     4       1  1.5952808
5     5       1  0.3295078
6     1       2         NA
7     2       2  0.4874291
8     3       2         NA
9     4       2  0.5757814
10    5       2 -0.3053884

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете использовать функцию zoo::rollapply для создания нового столбца со значениями, добавленными только с NA.Тогда вы можете просто построить эти точки.Например:

library(zoo)
library(ggplot2)

foo <-  data.frame(time =c(1:11), value = c(1 ,NA, 3, 4, 5, NA, 2, NA, 4, 5, NA))

# Perform sliding window processing
val <- c(NA, NA, foo$value, NA, NA) # Add NA at the ends of vector
val <- rollapply(val, width = 3, FUN = function(x){
    if (all(is.na(x) == c(TRUE, FALSE, TRUE))){
        return(x[2])
    } else {
        return(NA)
    }
})

foo$val_clean <- val[c(-1, -length(val))] # Remove first and last values

foo$val_clean

ggplot(foo) + geom_line(aes(time, value)) + geom_point(aes(time, val_clean))

ggplot results

0 голосов
/ 28 сентября 2018

Вы имеете в виду что-то подобное?

library(tidyverse)
dat %>%
    na.omit() %>%
    ggplot() +
    geom_line(aes(time, value, group = country))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...