Как определить самый длинный временной период и исключить другие строки в Excel или R? - PullRequest
1 голос
/ 06 мая 2020

В моем наборе данных есть информация о ZIPCODE 600K + ID. Если идентификатор переходит на другой адрес, я хочу определить, на каком почтовом индексе они прожили дольше всего, и поставить «1» для этого c года в этой строке (нет необходимости объединять строки, поскольку я хочу знать, где они в каком году прожил). Таким образом, идентификатор будет иметь только «1» для определенного года в одной строке (если для этого идентификатора несколько строк). Желтая подсветка - это то, чего я не хочу; в этом случае в двух строках за один и тот же год стоит «1». В предпочтительном наборе данных возможна только одна цифра «1» в год для каждого идентификатора.

Например: идентификатор 4 жил в 2013 году в 2 местах (Нью-Йорк и Лос-Анджелес), поэтому имеется 2 строки. На данный момент есть 1 в каждой строке за 2013 год, и я хочу только 1 в строке, идентификатор которой прожил дольше всего между 1-1-2013 и 31-12-2018. ID 4 прожил в 2013 году в Лос-Анджелесе дольше, чем в Нью-Йорке, поэтому в строке для Нью-Йорка должна быть только 1 (так что в этом случае строка LA будет удалена, потому что останутся только «0»).

Я тоже могу поместить этот файл в RStudio.

Спасибо!

structure(v1)
   ID    CITY ZIPCODE DATE_START   DATE_END DATE_END.1 X2013 X2014 X2015 X2016 X2017 X2018
1   1      NY  1234EF  1-12-2003            31-12-2018     1     1     1     1     1     1
2   2      NY  1234CD  1-12-2003  14-1-2019  14-1-2019     1     1     1     1     1     1
3   2      NY  1234AB  15-1-2019            31-12-2018     0     0     0     0     0     0
4   3      NY  1234AB  15-1-2019            31-12-2018     0     0     0     0     0     0
5   3      NY  1234CD  1-12-2003  14-1-2019  14-1-2019     1     1     1     1     1     1
6   4      LA  1111AB   4-5-2013            31-12-2018     1     1     1     1     1     1
7   4      NY  2222AB  1-12-2003   3-5-2013   3-5-2013     1     0     0     0     0     0
8   5   MIAMI  5555CD   6-2-2015  20-6-2016  20-6-2016     0     0     1     1     0     0
9   5   VEGAS  3333AB   1-1-2004            31-12-2018     1     1     1     1     1     1
10  5 ORLANDO  4444AB  26-2-2004   5-2-2015   5-2-2015     1     1     1     0     0     0
11  5   MIAMI  5555AB  21-6-2016 31-12-2018 31-12-2018     0     0     0     1     1     1
12  5   MIAMI  5555AB   1-1-2019            31-12-2018     0     0     0     0     0     0
13  6  AUSTIN  6666AB  28-2-2017  3-11-2017  3-11-2017     0     0     0     0     1     0
14  6  AUSTIN  6666AB  4-11-2017            31-12-2018     0     0     0     0     1     1
15  6  AUSTIN  7777AB  20-1-2017  27-2-2017  27-2-2017     0     0     0     0     1     0
16  6  AUSTIN  8888AB  1-12-2003  19-1-2017  19-1-2017     1     1     1     1     1     0
> 


structure(list(ID = c(1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L), CITY = structure(c(4L, 4L, 4L, 4L, 4L, 
2L, 4L, 3L, 6L, 5L, 3L, 3L, 1L, 1L, 1L, 1L), .Label = c("AUSTIN", 
"LA", "MIAMI", "NY", "ORLANDO", "VEGAS"), class = "factor"), 
    ZIPCODE = structure(c(4L, 3L, 2L, 2L, 3L, 1L, 5L, 9L, 6L, 
    7L, 8L, 8L, 10L, 10L, 11L, 12L), .Label = c("1111AB", "1234AB", 
    "1234CD", "1234EF", "2222AB", "3333AB", "4444AB", "5555AB", 
    "5555CD", "6666AB", "7777AB", "8888AB"), class = "factor"), 
    DATE_START = structure(c(3L, 3L, 4L, 4L, 3L, 10L, 3L, 11L, 
    1L, 7L, 6L, 2L, 8L, 9L, 5L, 3L), .Label = c("1-1-2004", "1-1-2019", 
    "1-12-2003", "15-1-2019", "20-1-2017", "21-6-2016", "26-2-2004", 
    "28-2-2017", "4-11-2017", "4-5-2013", "6-2-2015"), class = "factor"), 
    DATE_END = structure(c(1L, 2L, 1L, 1L, 2L, 1L, 7L, 4L, 1L, 
    9L, 8L, 1L, 6L, 1L, 5L, 3L), .Label = c("", "14-1-2019", 
    "19-1-2017", "20-6-2016", "27-2-2017", "3-11-2017", "3-5-2013", 
    "31-12-2018", "5-2-2015"), class = "factor"), DATE_END.1 = structure(c(7L, 
    1L, 7L, 7L, 1L, 7L, 6L, 3L, 7L, 8L, 7L, 7L, 5L, 7L, 4L, 2L
    ), .Label = c("14-1-2019", "19-1-2017", "20-6-2016", "27-2-2017", 
    "3-11-2017", "3-5-2013", "31-12-2018", "5-2-2015"), class = "factor"), 
    X2013 = c(1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 
    0L, 0L, 0L, 1L), X2014 = c(1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 
    1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L), X2015 = c(1L, 1L, 0L, 0L, 
    1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L), X2016 = c(1L, 
    1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L
    ), X2017 = c(1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 
    0L, 1L, 1L, 1L, 1L), X2018 = c(1L, 1L, 0L, 0L, 1L, 1L, 0L, 
    0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-16L))

enter image description here

1 Ответ

1 голос
/ 06 мая 2020

Вы можете воспользоваться небольшой подсказкой из пакета lubridate, чтобы подсчитать, сколько дней вы проводите в каждом месте. Затем мы можем group_by ID и использовать case_when для назначения 1, когда время является максимальным, или 0 в противном случае.

library(lubridate)
library(dplyr)
v1 %>%
  dplyr::select(ID,CITY,ZIPCODE,DATE_START,DATE_END.1) %>%
  rowwise() %>%
  mutate("X2013" = max(0, min(dmy("31-12-2013"),dmy(DATE_END.1)) - max(dmy("1-1-2013"),dmy(DATE_START))),
         "X2014" = max(0, min(dmy("31-12-2014"),dmy(DATE_END.1)) - max(dmy("1-1-2014"),dmy(DATE_START))),
         "X2015" = max(0, min(dmy("31-12-2015"),dmy(DATE_END.1)) - max(dmy("1-1-2015"),dmy(DATE_START))),
         "X2016" = max(0, min(dmy("31-12-2016"),dmy(DATE_END.1)) - max(dmy("1-1-2016"),dmy(DATE_START))),
         "X2017" = max(0, min(dmy("31-12-2017"),dmy(DATE_END.1)) - max(dmy("1-1-2017"),dmy(DATE_START))),
         "X2018" = max(0, min(dmy("31-12-2018"),dmy(DATE_END.1)) - max(dmy("1-1-2018"),dmy(DATE_START)))) %>%
  ungroup %>%
  group_by(ID) %>%
  mutate_at(vars(starts_with("X")),list(~ case_when(. == max(.) ~ 1,
                                                    TRUE ~ 0)))
# A tibble: 16 x 11
# Groups:   ID [6]
      ID CITY    ZIPCODE DATE_START DATE_END.1 X2013 X2014 X2015 X2016 X2017 X2018
   <int> <fct>   <fct>   <fct>      <fct>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     1 NY      1234EF  1-12-2003  31-12-2018     1     1     1     1     1     1
 2     2 NY      1234CD  1-12-2003  14-1-2019      1     1     1     1     1     1
 3     2 NY      1234AB  15-1-2019  31-12-2018     0     0     0     0     0     0
 4     3 NY      1234AB  15-1-2019  31-12-2018     0     0     0     0     0     0
 5     3 NY      1234CD  1-12-2003  14-1-2019      1     1     1     1     1     1
 6     4 LA      1111AB  4-5-2013   31-12-2018     1     1     1     1     1     1
 7     4 NY      2222AB  1-12-2003  3-5-2013       0     0     0     0     0     0
 8     5 MIAMI   5555CD  6-2-2015   20-6-2016      0     0     0     0     0     0
 9     5 VEGAS   3333AB  1-1-2004   31-12-2018     1     1     1     1     1     1
10     5 ORLANDO 4444AB  26-2-2004  5-2-2015       1     1     0     0     0     0
11     5 MIAMI   5555AB  21-6-2016  31-12-2018     0     0     0     0     1     1
12     5 MIAMI   5555AB  1-1-2019   31-12-2018     0     0     0     0     0     0
13     6 AUSTIN  6666AB  28-2-2017  3-11-2017      0     0     0     0     1     0
14     6 AUSTIN  6666AB  4-11-2017  31-12-2018     0     0     0     0     0     1
15     6 AUSTIN  7777AB  20-1-2017  27-2-2017      0     0     0     0     0     0
16     6 AUSTIN  8888AB  1-12-2003  19-1-2017      1     1     1     1     0     0

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

...