【问题标题】:How to determine the longest timeperiod and exclude other rows in Excel or R?如何确定最长的时间段并排除 Excel 或 R 中的其他行?
【发布时间】:2020-08-21 20:00:51
【问题描述】:

在我的数据集中,我有 600K+ ID 的邮政编码信息。如果 ID 移动到不同的地址,我想确定他们居住时间最长的邮政编码,并在该行中为该特定年份输入“1”(无需组合行,因为我想知道他们是否住在哪里年)。这样一来,ID 在某一年的一行中只有一个“1”(如果该 ID 有多行)。黄色突出显示是我不想要的;在这种情况下,同一年的两行中有一个“1”。在首选数据集中,每个 ID 每年可能只有一个“1”。

例如:ID 4 于 2013 年住在 2 个地方(纽约和洛杉矶),因此有 2 行。此时,2013 年的每一行都有一个 1,我只想要 ID 在 2013 年 1 月 1 日和 2018 年 12 月 31 日之间最长的行中的 1。 ID 4 在 2013 年在 LA 的居住时间比在 NY 的时间长,因此 NY 的行中应该只有 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))

【问题讨论】:

  • 嗨 Student0172,这是 R 中的一个简单操作,但是如果您想增加响应的可能性,如果您提供最少的可重复数据,您将更有可能得到答案。请参阅How to make a great R reproducible example 了解更多信息。
  • 您好伊恩,感谢您的回答。我在我的问题中添加了 R 结构。
  • 嗨,Ian,我从另一个命令中尝试了您之前的代码(不确定它去了哪里?)。谢谢你的回答。我已经加载了 dplyr 包,但我仍然收到此错误:dmy(DATE_END.1) 中的错误:找不到函数“dmy”..你有什么想法吗?

标签: r excel date time lubridate


【解决方案1】:

您可以使用 lubridate 软件包中的一些帮助来计算在每个位置花费的天数。然后我们可以group_byID 并在时间最大时使用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 调用,不需要每年手动编写,但需要的工作量比仅仅输入要多得多。

【讨论】:

  • 您好伊恩,感谢您的帮助!不幸的是,我收到了这个错误:分组行数据框会剥离行性质。在网上我发现了一些关于再次取消分组数据的东西。你熟悉这个错误吗?关于 mutate:我很感谢这个 anwser,因为我可以通过这种方式更好地理解它!
  • 抱歉,我使用的是dplyr 的开发版本,但没有意识到这会是个问题。我编辑了我的答案。
  • 非常感谢伊恩,它成功了!我在开头添加了 v2
  • 嗨,Ian,我在我的原始数据集(990K 行)中尝试了你的代码。但是,我让它整夜运行,什么也没发生。我目前正在再次运行它。你知道这是为什么吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多