如何为R中的每个id分配日期序列

时间:2014-08-16 20:12:50

标签: r

示例数据:

 x <- data.frame(id=c(1,1,1,2,2,7,7,7,7,9,9,10),dna=c(232,424,5345,45345,45,345,4543,345345,4545,2323,23,1222))
 date.seq <- as.Date(Sys.Date():as.Date("2014-09-10"))[1:length(unique(x$id))]

这里我填写每个id对应的日期。

data.frame(x,Dates=rep(date.seq,data.frame(table(x$id))$Freq))

给出:

    id   dna      Dates
  1  1   232 2014-08-16
  2  1   424 2014-08-16
  3  1  5345 2014-08-16
  4  2 45345 2014-08-17
  5  2    45 2014-08-17
  6  7   345 2014-08-18

但是,我想任意分配日期序列的长度。期望输出日期超过3个id:

      id    dna      Dates
   1   1    232 16-08-2014
   2   1    424 16-08-2014
   3   1   5345 16-08-2014
   4   2  45345 16-08-2014
   5   2     45 16-08-2014
   6   7    345 16-08-2014
   7   7   4543 16-08-2014
   8   7 345345 16-08-2014
   9   7   4545 16-08-2014
   10  9   2323 17-08-2014
   11  9     23 17-08-2014
   12 10   1222 18-08-2014

1 个答案:

答案 0 :(得分:2)

首先创建id的顺序列表,然后使用除法运算符将每个id分配给一个组。

x <- data.frame(id=c(1,1,1,2,2,7,7,7,7),dna=c(232,424,5345,45345,45,345,4543,345345,4545))
seq.id <- match(x$id,unique(x$id))

n <- 1
x$Dates <- Sys.Date() + (seq.id-1) %/% n
#   id    dna      Dates
# 1  1    232 2014-08-16
# 2  1    424 2014-08-16
# 3  1   5345 2014-08-16
# 4  2  45345 2014-08-17
# 5  2     45 2014-08-17
# 6  7    345 2014-08-18
# 7  7   4543 2014-08-18
# 8  7 345345 2014-08-18
# 9  7   4545 2014-08-18

n <- 2
x$Dates <- Sys.Date() + (seq.id-1) %/% n
#   id    dna      Dates
# 1  1    232 2014-08-16
# 2  1    424 2014-08-16
# 3  1   5345 2014-08-16
# 4  2  45345 2014-08-16
# 5  2     45 2014-08-16
# 6  7    345 2014-08-17
# 7  7   4543 2014-08-17
# 8  7 345345 2014-08-17
# 9  7   4545 2014-08-17

n <- 3
x$Dates <- Sys.Date() + (seq.id-1) %/% n
#   id    dna      Dates
# 1  1    232 2014-08-16
# 2  1    424 2014-08-16
# 3  1   5345 2014-08-16
# 4  2  45345 2014-08-16
# 5  2     45 2014-08-16
# 6  7    345 2014-08-16
# 7  7   4543 2014-08-16
# 8  7 345345 2014-08-16
# 9  7   4545 2014-08-16