выбрать строки на основе даты (за один день до и после определенной даты) на основе двух фреймов данных в r - PullRequest
1 голос
/ 16 марта 2020

У меня есть два фрейма данных следующим образом:

anom_df:

 date         id  country     anoms
 2017-01-01   26      US        0
 2017-01-02   26      US        0
 2017-01-03   26      US        9
 2017-01-04   26      US        0
 2017-01-05   26      US        0
 2017-01-06   26      US        0
 2017-01-07   26      US        0
 2017-01-08   26      US        0
 2017-01-09   26      US        100
 2017-01-10   26      US        0

и master_df

date         id     country    value     
 2017-01-01   26      US        2            
 2017-01-02   26      US        4             
 2017-01-03   26      US        9             
 2017-01-04   26      US        2             
 2017-01-05   26      US        4             
 2017-01-06   26      US        1
 2017-01-07   26      US        5
 2017-01-08   26      US        3
 2017-01-09   26      US        100
 2017-01-10   26      US        4 

Я хочу создать третью таблицу из master_df и присоединитесь к anom_df, чтобы выбрать только даты, которые имеют значение в столбце anom таблицы anom $ и за один день до и один день после этой даты из master_df

Наконец, я хочу получить следующую таблицу

 date         id  country     value
 2017-01-02   26      US        2
 2017-01-03   26      US        9
 2017-01-04   26      US        4
 2017-01-08   26      US        3
 2017-01-09   26      US        100
 2017-01-10   26      US        4

Я пробовал следующий код для поиска в шорт-листе datafrmae:

before_after_anom<- dplyr::left_join(master_df,anom_df,by=c('id','country','date')) 
%>% mutate(diff = value - lag(value))

Однако он не дает мне правильный фрейм данных, не могли бы вы помочь мне, как его отфильтровать.

Ответы [ 2 ]

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

Это не соответствует ожидаемому результату, но соответствует описанию, которое у вас есть.

library(dplyr)

left_join(master_df, anom_df, by = c('country', 'id', 'date')) %>%
  slice({inds <- which(anoms != 0); c(inds - 1, inds, inds + 1)}) %>%
  arrange(date)

#        date id country value anoms
#1 2017-01-02 26      US     4     0
#2 2017-01-03 26      US     9     9
#3 2017-01-04 26      US     2     0
#4 2017-01-07 26      US     5     0
#5 2017-01-08 26      US     3   100
#6 2017-01-09 26      US   100     0

Мы находим ненулевые индексы в anoms и выбираем строки на одну строку выше и ниже этих индексов.

0 голосов
/ 16 марта 2020
library(tidyverse)

Я хочу создать третью таблицу из master_df и объединить ее с anom_df, чтобы выбрать только даты, имеющие значение в столбце anom в таблице $ anom

Это полу операция соединения.

master_df <- read_delim("data/master_df", delim = "\\s")
(
    anom_df <-
        "date         id  country     anoms
2017-01-01   26      US        0
2017-01-02   26      US        0
2017-01-03   26      US        9
2017-01-04   26      US        0
2017-01-05   26      US        0
2017-01-06   26      US        0
2017-01-07   26      US        0
2017-01-08   26      US        100
2017-01-09   26      US        0
2017-01-09   26      US        0" %>%
    str_replace_all("[:blank:]+", ",") %>%
    read_csv()
)
## # A tibble: 10 x 4
##    date          id country anoms
##    <date>     <dbl> <chr>   <dbl>
##  1 2017-01-01    26 US          0
##  2 2017-01-02    26 US          0
##  3 2017-01-03    26 US          9
##  4 2017-01-04    26 US          0
##  5 2017-01-05    26 US          0
##  6 2017-01-06    26 US          0
##  7 2017-01-07    26 US          0
##  8 2017-01-08    26 US        100
##  9 2017-01-09    26 US          0
## 10 2017-01-09    26 US          0
(
    master_df <-
        "date         id     country    value
2017-01-01   26      AF        2
2017-01-02   26      US        4
2017-01-03   26      US        9
2017-01-04   26      AF        2
2017-01-05   26      US        4
2017-01-06   26      BE        1
2017-01-07   26      US        5
2017-01-08   26      US        3
2017-01-09   26      US        100
2017-01-10   26      US        4 " %>%
    str_replace_all("[:blank:]+", ",") %>%
    read_csv()
)
## Warning: 1 parsing failure.
## row col  expected    actual         file
##  10  -- 4 columns 5 columns literal data

## # A tibble: 10 x 4
##    date          id country value
##    <date>     <dbl> <chr>   <dbl>
##  1 2017-01-01    26 AF          2
##  2 2017-01-02    26 US          4
##  3 2017-01-03    26 US          9
##  4 2017-01-04    26 AF          2
##  5 2017-01-05    26 US          4
##  6 2017-01-06    26 BE          1
##  7 2017-01-07    26 US          5
##  8 2017-01-08    26 US          3
##  9 2017-01-09    26 US        100
## 10 2017-01-10    26 US          4
master_df %>% 
    semi_join(anom_df,by=c('id','country','date'))
## # A tibble: 6 x 4
##   date          id country value
##   <date>     <dbl> <chr>   <dbl>
## 1 2017-01-02    26 US          4
## 2 2017-01-03    26 US          9
## 3 2017-01-05    26 US          4
## 4 2017-01-07    26 US          5
## 5 2017-01-08    26 US          3
## 6 2017-01-09    26 US        100

за один день до и один день после этой даты из master_df

Но я не знаю, что это значит? Просто получить разницу?

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