为每个组添加固定数量的行,并基于另一列添加值

时间:2019-07-08 03:43:54

标签: r dplyr

我有一个很大的数据框,其中包含ID和每个ID的干预开始日期:

  ID Date
1 1  17228
2 2  17226
3 3  17230

我想向每个ID添加2行,并以后续日期作为这些行中的值:

  ID Date
1 1  17228
2 1  17229
3 1  17230
4 2  17226
5 2  17227
6 2  17228
7 3  17230
8 3  17231
9 3  17232

是否有可能使用dplyr?其他方式也可以!

3 个答案:

答案 0 :(得分:2)

我们通过uncount扩展数据,然后按“ ID”分组,从seq“日期”到行数({{1} }),同时递增first 1

n()

或者另一个选择是by的{​​{1}}列

library(tidyverse)
df1 %>%
  uncount(3) %>% 
  group_by(ID) %>% 
  mutate(Date = seq(Date[1], length.out = n(), by = 1))
# A tibble: 9 x 2
# Groups:   ID [3]
#     ID  Date
#  <int> <dbl>
#1     1 17228
#2     1 17229
#3     1 17230
#4     2 17226
#5     2 17227
#6     2 17228
#7     3 17230
#8     3 17231
#9     3 17232

或与unnest

list

或使用df1 %>% group_by(ID) %>% mutate(Date = list(Date[1] + 0:2)) %>% unnest (在评论中粘贴)

complete

或更紧凑的df1 %>% group_by(ID) %>% complete(Date = first(Date) + 0:2)

base R

答案 1 :(得分:1)

do.call(rbind, lapply(split(d, d$ID), function(x){
    rbind(x, data.frame(ID = rep(tail(x$ID, 1), 2),
                        Date = tail(x$Date, 1) + 1:2))
}))
#     ID  Date
#1.1   1 17228
#1.11  1 17229
#1.2   1 17230
#2.2   2 17226
#2.1   2 17227
#2.21  2 17228
#3.3   3 17230
#3.1   3 17231
#3.2   3 17232

数据

d = structure(list(ID = 1:3, Date = c(17228L, 17226L, 17230L)),
              class = "data.frame",
              row.names = c("1", "2", "3"))

答案 2 :(得分:0)

使用within(df1[rep(seq_len(nrow(df1)), each = 3),], Date <- Date + 0:2) ,我们可以将每行重复3次,data.table library(data.table) setDT(df1)[, .(Date = Date + 0:2), ID] ,然后将每个dplyr的每个日期从0递增到group_by

ID

使用与上面相同的逻辑的基本R单线将是

n() - 1