我有一个很大的数据框,其中包含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?其他方式也可以!
答案 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