用R中的每周顺序替换重复的日期

时间:2018-12-03 04:49:10

标签: r dplyr tidyr zoo lubridate

我正在处理类似的数据

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(动态读取)分组的第一个日期为准​​,并以每周的顺序方式在随后的行中填充日期。感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以与组一起创建每周序列

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

答案 1 :(得分:0)

可以使用

您的数据:

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