Сопоставить и извлечь идентификатор только тех строк Date, которые имеют хотя бы одно значение за пределами указанного диапазона - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть фрейм данных с несколькими date столбцами.

    Index Measurement       Date Measure.1     Date.1 Measure.2     Date.2 Measure.3     Date.3
1       1        56.0 2018-03-16         2 2018-03-23        12 2018-03-29      22.0 2018-04-05
2       2        56.0 2018-03-16        78 2018-03-23     41234 2018-03-29      12.0 2018-04-05
3      12        65.0       <NA>        54 2018-03-23        35       <NA>     323.0 2018-04-05
4      15       129.1 2018-03-16        78 2018-03-23        12 2018-03-29       2.0 2018-04-05
5      22        56.0 2018-03-16       786 2018-03-23       234 2018-03-29      21.0       <NA>
6     567          NA 2018-03-16        34 2018-03-23         4 2018-03-29     545.0 2018-04-21
7      75         5.0 2018-03-16        52 2018-03-23         3 2018-03-29       5.0 2018-04-05
8     563        12.0 2018-03-16        43 2018-03-23        34 2018-03-29       5.0 2018-04-05
9     436        12.0 2018-03-16         3 2018-03-23       123 2018-03-29     213.0 2018-04-05
10  34533        56.0 2018-03-16        43 2018-03-23        32 2018-03-29       5.0 2018-04-25
11 234234        76.0 2018-03-16       234 2018-03-31       324 2018-05-06       5.0 2018-04-05
12   6643        76.0 2018-03-16        23 2018-03-23       123 2018-03-29       0.2 2018-04-11

Вот код для загрузки моих данных (небольшой пример):

structure(list(Index = c(1L, 2L, 12L, 15L, 22L, 567L, 75L, 563L, 
436L, 34533L, 234234L, 6643L), Measurement = c(56, 56, 65, 129.1, 
56, NA, 5, 12, 12, 56, 76, 76), Date = structure(c(17606, 17606, 
NA, 17606, 17606, 17606, 17606, 17606, 17606, 17606, 17606, 17606
), class = "Date"), Measure.1 = c(2L, 78L, 54L, 78L, 786L, 34L, 
52L, 43L, 3L, 43L, 234L, 23L), Date.1 = structure(c(17613, 17613, 
17613, 17613, 17613, 17613, 17613, 17613, 17613, 17613, 17621, 
17613), class = "Date"), Measure.2 = c(12L, 41234L, 35L, 12L, 
234L, 4L, 3L, 34L, 123L, 32L, 324L, 123L), Date.2 = structure(c(17619, 
17619, NA, 17619, 17619, 17619, 17619, 17619, 17619, 17619, 17657, 
17619), class = "Date"), Measure.3 = c(22, 12, 323, 2, 21, 545, 
5, 5, 213, 5, 5, 0.2), Date.3 = structure(c(17626, 17626, 17626, 
17626, NA, 17642, 17626, 17626, 17626, 17646, 17626, 17632), class = "Date")), .Names = c("Index", 
"Measurement", "Date", "Measure.1", "Date.1", "Measure.2", "Date.2", 
"Measure.3", "Date.3"), row.names = c(NA, -12L), class = "data.frame")

Мне нужно посмотреть на соседние Date столбцы построчно , а разница между каждой соседней ячейкой даты должна составлять не более 9 дней и не менее 3 дней .

Я могу добиться этого следующим образом:

diffdate_table <- df[ , grep( "Date" , names( df ) ) ] %>% rowwise() %>% diff.Date

Вывод кода выше будет:

> diffdate_table 
    Date.1  Date.2   Date.3
1   7 days  6 days   7 days
2   7 days  6 days   7 days
3  NA days NA days  NA days
4   7 days  6 days   7 days
5   7 days  6 days  NA days
6   7 days  6 days  23 days
7   7 days  6 days   7 days
8   7 days  6 days   7 days
9   7 days  6 days   7 days
10  7 days  6 days  27 days
11 15 days 36 days -31 days
12  7 days  6 days  13 days

ВОПРОС .

Как извлечь Index (столбец в указанном выше наборе данных) из тех строк, которые имеют по крайней мере одно различие, которое составляет более 9 дней и меньше 3, как рассчитано в diffdate_table?

1 Ответ

0 голосов
/ 25 апреля 2018

Интересный вопрос, плюс я никогда раньше не видел diff.Date.Вот два dplyr способа сделать это.Оба получают один и тот же результат, это просто вопрос того, хотите ли вы работать с данными в длинной или широкой форме для выполнения различий.

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

Второй gather с самого начала все в длинной форме, использует lag и просто вычитание дат.

Обазатем сгруппируйте по индексу и посчитайте количество различий с вашими критериями.Надеюсь, что это поможет!

library(tidyverse)

diffs1 <- df %>%
    column_to_rownames("Index") %>%
    select_at(vars(starts_with("Date"))) %>%
    diff.Date() %>%
    rownames_to_column("Index") %>%
    mutate(Index = as.integer(Index)) %>%
    gather(key = date, value = diff, -Index) %>%
    filter(diff %>% between(3, 9)) %>%
    count(Index) %>%
    ungroup() %>%
    arrange(Index)

diffs1
#> # A tibble: 10 x 2
#>    Index     n
#>    <int> <int>
#>  1     1     3
#>  2     2     3
#>  3    15     3
#>  4    22     2
#>  5    75     3
#>  6   436     3
#>  7   563     3
#>  8   567     2
#>  9  6643     2
#> 10 34533     2

diffs1$Index
#>  [1]     1     2    15    22    75   436   563   567  6643 34533

diffs2 <- df %>%
    select_at(vars(Index, starts_with("Date"))) %>%
    gather(key = obs, value = date, -Index) %>%
    group_by(Index) %>%
    mutate(prev_date = lag(date)) %>%
    mutate(diff = date - prev_date) %>%
    filter(!is.na(diff)) %>%
    filter(diff %>% between(3, 9)) %>%
    summarise(n = n())

Создано в 2018-04-25 пакетом Представить (v0.2.0).

Редактировать :Просто понял, что вас может не заинтересовать подсчет того, сколько раз каждый индекс имеет разницу в вашем диапазоне, только индексы, которые соответствуют этим критериям.В этом случае вы можете просто остановиться после filter(diff %>% between(3, 9)) и взять уникальные индексы с помощью unique(diff1$Index).

...