【问题标题】:replace duplicate dates with weekly sequence order in R用R中的每周顺序替换重复的日期
【发布时间】:2019-05-04 09:15:51
【问题描述】:

我正在处理类似的数据

structure(list(id = c("aaa", "aaa", "aaa", "aaa", "aaa", "aaa", 
"aaa", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "ccc", 
"ccc", "ccc", "ccc", "ccc", "ccc"), score = c(100.5, 110.46, 
113.35, 128.214, 130.123, 134.56, 139.56, 20.5, 21.465, 30.436, 
49.24, 60.325, 66.4, 70.25, 99.43, 70.35, 64.4, 60.325, 55.35, 
42.35), date = c("2018-02-25", "2018-02-25", "2018-02-25", "2018-02-25", 
"2018-02-25", "2018-02-25", "2018-02-25", "2018-03-18", "2018-03-18", 
"2018-03-18", "2018-03-18", "2018-03-18", "2018-03-18", "2018-03-18", 
"2018-04-22", "2018-04-22", "2018-04-22", "2018-04-22", "2018-04-22", 
"2018-04-22")), class = "data.frame", row.names = c(NA, -20L))

我想通过按 id 分组的每周日期序列来替换重复的日期值,以获得更大的数据集。 我的示例输出:

id      score        date
aaa    100.5      2018-02-25
aaa    110.46     2018-03-04
aaa    113.35     2018-03-11
aaa    128.214    2018-03-18
aaa    130.123    2018-03-25
aaa    134.56     2018-04-01
aaa    139.56     2018-04-08
bbb    20.5       2018-03-18
bbb    21.465     2018-03-25
bbb    30.436     2018-04-01
bbb    49.24      2018-04-08
bbb    60.325     2018-04-15
bbb    66.4       2018-04-22
bbb    70.25      2018-04-29
ccc    99.43      2018-04-22
ccc    70.35      2018-04-29
ccc    64.4       2018-05-06
ccc    60.325     2018-05-13
ccc    55.35      2018-05-20
ccc    42.35      2018-05-27

基本上它应该采用按 id 分组的第一个日期(动态读取)并以每周顺序的方式用日期填充以下行。感谢任何帮助。

【问题讨论】:

  • 我不确定我是否遵循(或“同意”)您的逻辑。数据显然对每个 id 都有一个唯一的日期,您想从那里更改 date 的值吗?如果数据以这种方式提供给您,那么您可能需要调整数据的创建方式。如果没有,那么也许我们应该关注您如何导入数据。话虽如此......我认为bydplyr::group_by(和dplyr::n)将是扭曲这些数据的一种方法。
  • 您能否使用 dplyr@r2evans 分享解决方案

标签: r dplyr tidyr zoo lubridate


【解决方案1】:

您可以使用组创建每周序列

library(dplyr)
df %>%
  group_by(id, date) %>%
  mutate(new_date= seq(as.Date(date[1]), length.out = n(), by = "week"))

#   id    score date       new_date  
#   <chr> <dbl> <chr>      <date>    
# 1 aaa   100.  2018-02-25 2018-02-25
# 2 aaa   110.  2018-02-25 2018-03-04
# 3 aaa   113.  2018-02-25 2018-03-11
# 4 aaa   128.  2018-02-25 2018-03-18
# 5 aaa   130.  2018-02-25 2018-03-25
# 6 aaa   135.  2018-02-25 2018-04-01
# 7 aaa   140.  2018-02-25 2018-04-08
# 8 bbb    20.5 2018-03-18 2018-03-18
# 9 bbb    21.5 2018-03-18 2018-03-25
#10 bbb    30.4 2018-03-18 2018-04-01
#11 bbb    49.2 2018-03-18 2018-04-08
#12 bbb    60.3 2018-03-18 2018-04-15
#13 bbb    66.4 2018-03-18 2018-04-22
#14 bbb    70.2 2018-03-18 2018-04-29
#15 ccc    99.4 2018-04-22 2018-04-22
#16 ccc    70.4 2018-04-22 2018-04-29
#17 ccc    64.4 2018-04-22 2018-05-06
#18 ccc    60.3 2018-04-22 2018-05-13
#19 ccc    55.4 2018-04-22 2018-05-20
#20 ccc    42.4 2018-04-22 2018-05-27

【讨论】:

    【解决方案2】:

    这可以使用

    您的数据:

    x <- structure(list(id = c("aaa", "aaa", "aaa", "aaa", "aaa", "aaa", 
    "aaa", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "ccc", 
    "ccc", "ccc", "ccc", "ccc", "ccc"), score = c(100.5, 110.46, 
    113.35, 128.214, 130.123, 134.56, 139.56, 20.5, 21.465, 30.436, 
    49.24, 60.325, 66.4, 70.25, 99.43, 70.35, 64.4, 60.325, 55.35, 
    42.35), date = c("2018-02-25", "2018-02-25", "2018-02-25", "2018-02-25", 
    "2018-02-25", "2018-02-25", "2018-02-25", "2018-03-18", "2018-03-18", 
    "2018-03-18", "2018-03-18", "2018-03-18", "2018-03-18", "2018-03-18", 
    "2018-04-22", "2018-04-22", "2018-04-22", "2018-04-22", "2018-04-22", 
    "2018-04-22")), class = "data.frame", row.names = c(NA, -20L))
    x$date <- as.Date(x$date)
    

    一种方法:

    library(dplyr)
    x %>%
      group_by(id) %>%
      mutate(date = seq(date[1], by = "week", length.out = n())) %>%
      ungroup()
    # # A tibble: 20 x 3
    #    id    score date      
    #    <chr> <dbl> <date>    
    #  1 aaa   100.  2018-02-25
    #  2 aaa   110.  2018-03-04
    #  3 aaa   113.  2018-03-11
    #  4 aaa   128.  2018-03-18
    #  5 aaa   130.  2018-03-25
    #  6 aaa   135.  2018-04-01
    #  7 aaa   140.  2018-04-08
    #  8 bbb    20.5 2018-03-18
    #  9 bbb    21.5 2018-03-25
    # 10 bbb    30.4 2018-04-01
    # 11 bbb    49.2 2018-04-08
    # 12 bbb    60.3 2018-04-15
    # 13 bbb    66.4 2018-04-22
    # 14 bbb    70.2 2018-04-29
    # 15 ccc    99.4 2018-04-22
    # 16 ccc    70.4 2018-04-29
    # 17 ccc    64.4 2018-05-06
    # 18 ccc    60.3 2018-05-13
    # 19 ccc    55.4 2018-05-20
    # 20 ccc    42.4 2018-05-27
    

    【讨论】:

    • 因为 OP 说I would like to replace the duplicated date values,所以我也将date 分组。一个id 中可能有更多独特的日期。
    • 好主意...我将其解释为 "id 的所有日期都是重复的",而您将其解释为 "每个日期的所有重复日期id"。他们都在假设的情况下工作,很好的想法 RonakShah。
    猜你喜欢
    • 2014-02-05
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多