удалить строки дат и повторяющиеся даты для любой даты, которая имеет NA - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу удалить все даты, в которых есть какие-либо NA / недостающие данные для любого типа наблюдения, из data.frame, в котором есть повторяющиеся даты.Например, здесь я хотел бы получить data.frame из трех строк с данными 2018-12-05.Мой пример, не являющийся примером data.frame, довольно длинный, поэтому я склоняюсь ко времени выполнения, а не к читабельности, если есть несколько способов, и я открыт для tidyverse и нетидиверсовых способов.

date_time <- rep(seq(from=as.POSIXct("2018-12-01", tz="GMT"), 
             to=as.POSIXct("2018-12-05", tz="GMT"), by="1 day"),3)
value     <- c(1,2,NA,NA,5,NA,NA,NA,4,5,7,NA,NA,NA,8)
class     <- c(rep("a", 5), rep("b", 5), rep("c", 5))
df        <- data.frame(date_time, value, class)

от:

enter image description here

отфильтровано до:

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

В некоторых dplyr функциях вы можете использовать базу all.Сгруппируйте по дате, затем найдите, не являются ли все значения для каждой группы не NA.

. С некоторыми дополнительными шагами для иллюстрации:

library(dplyr)

df %>%
  arrange(date_time, class) %>%
  group_by(date_time) %>%
  mutate(all_vals = all(!is.na(value))) %>%
  filter(all_vals)
#> # A tibble: 3 x 4
#> # Groups:   date_time [1]
#>   date_time           value class all_vals
#>   <dttm>              <dbl> <fct> <lgl>   
#> 1 2018-12-05 00:00:00     5 a     TRUE    
#> 2 2018-12-05 00:00:00     5 b     TRUE    
#> 3 2018-12-05 00:00:00     8 c     TRUE

Или, более кратко, найдите не- NA с в filter:

df %>%
  group_by(date_time) %>%
  filter(all(!is.na(value)))
#> # A tibble: 3 x 3
#> # Groups:   date_time [1]
#>   date_time           value class
#>   <dttm>              <dbl> <fct>
#> 1 2018-12-05 00:00:00     5 a    
#> 2 2018-12-05 00:00:00     5 b    
#> 3 2018-12-05 00:00:00     8 c

Создано в 2018-12-01 пакетом Представить (v0.2.1)

0 голосов
/ 01 декабря 2018

Если вам нужна скорость, я не знаю.Но следующая функция сохраняет только те строки, где даты имеют все значения class.

fun <- function(DF){
  DF2 <- DF[!is.na(DF$value), ]
  u <- unique(DF2$class)
  sp <- split(DF2, DF2$date_time)
  inx <- sapply(sp, function(d){
    all(u %in% d$class)
  })
  DF2 <- do.call(rbind, sp[inx])
  row.names(DF2) <- NULL
  DF2
}

fun(df)
#   date_time value class
#1 2018-12-05     5     a
#2 2018-12-05     5     b
#3 2018-12-05     8     c

Правка.
Вот сравнительный тест скорости. Камилла ответ быстрее для больших данных, где скорость важнее.И приятнее.

library(microbenchmark)
library(ggplot2)
library(dplyr)

fun2 <- function(DF){
  DF %>%
    arrange(date_time, class) %>%
    group_by(date_time) %>%
    mutate(all_vals = all(!is.na(value))) %>%
    filter(all_vals)
}

mb <- microbenchmark(
  rui = fun(df),
  camille = fun2(df)
)
mb1 <- microbenchmark(
  rui = fun(df1),
  camille = fun2(df1)
)

ap <- autoplot(mb)
ap1 <- autoplot(mb1)
cowplot::plot_grid(ap, ap1)

enter image description here

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