我的数据看起来像这样:
data_t <- data.frame(identfiant = paste0('ID_', 1:5),
date = c('2018-02-06', '2018-05-14', '2018-03-23', '2018-04-10', '2018-03-03'),
ndays = c(4,2,3,5,2))
结果为:
identfiant date ndays
1 ID_1 2018-02-06 4
2 ID_2 2018-05-14 2
3 ID_3 2018-03-23 3
4 ID_4 2018-04-10 5
5 ID_5 2018-03-03 2
我想创建一个新表,如下所示:
identfiant date ndays y
1 ID_1 2018-02-06 4 2018-02-07
2 ID_1 2018-02-06 4 2018-02-08
3 ID_1 2018-02-06 4 2018-02-09
4 ID_1 2018-02-06 4 2018-02-10
5 ID_2 2018-05-14 2 2018-05-15
6 ID_2 2018-05-14 2 2018-05-16
7 ID_3 2018-03-23 3 2018-03-24
8 ID_3 2018-03-23 3 2018-03-25
9 ID_3 2018-03-23 3 2018-03-26
10 ID_4 2018-04-10 5 2018-04-11
11 ID_4 2018-04-10 5 2018-04-12
12 ID_4 2018-04-10 5 2018-04-13
13 ID_4 2018-04-10 5 2018-04-14
14 ID_4 2018-04-10 5 2018-04-15
15 ID_5 2018-03-03 2 2018-03-04
16 ID_5 2018-03-03 2 2018-03-05
我们看到,每个初始行都重复ndays
次,新列y
由date + 1:ndays
组成。
是否可以使用dplyr或data.table完成此操作。
我绝对不想使用for
循环(对于大数据来说太长了)和seq_along
。
我想到了首先创建一列,将每一行的所有可能值粘贴在一起,以便例如在第一行中使用y = '2018-02-07;2018-02-08;2018-02-09;2018-02-10'
,然后执行reshape(dcast)
或{{1} }。
我的代码如下:
separate_rows
问题在于,对于R,data_t2 <- data_t %>%
mutate(
y = paste0(as.Date(date)+1:ndays, collapse = ";")
) %>%
separate_row(y, sep = ";\\s+")
是一个向量,并且由于它不单独处理每行,因此它会通过处理向量data_t$date
来尝试创建新的向量y
一次,并且不知道要引用data_t$date
的哪个值。而且我们将遇到向量长度一致性问题。
有人有主意吗?
预先感谢
答案 0 :(得分:1)
我们应该能够在dplyr
和tidyr
内做到这一点
使用tidyr::uncount
,我们可以通过根据ndays
复制行来重新格式化数据。
接下来,我们将根据identfiant
(或identfiant
和date
来对数据进行分组,具体取决于identfiant
是否唯一)。
最后,我们将使用mutate
确保我们的date
字段属于正确的类,然后在组中添加行号(对于每个组,行号都像1:ndays
。< / p>
library(dplyr)
library(tidyr)
data_t %>%
uncount(ndays, .remove = FALSE) %>%
group_by(identfiant) %>%
mutate(date = as.Date(date),
y = date + row_number())
tidyr
方法:df.expanded <- data_t[rep(seq(nrow(data_t)), data_t$ndays), ]
df.expanded %>%
group_by(identfiant) %>%
mutate(date = as.Date(date),
y = date + row_number())
无论哪种方式,两种方法都可以为我们提供以下信息:
# A tibble: 16 x 4
# Groups: identfiant [5]
identfiant date ndays y
<fct> <date> <dbl> <date>
1 ID_1 2018-02-06 4. 2018-02-07
2 ID_1 2018-02-06 4. 2018-02-08
3 ID_1 2018-02-06 4. 2018-02-09
4 ID_1 2018-02-06 4. 2018-02-10
5 ID_2 2018-05-14 2. 2018-05-15
6 ID_2 2018-05-14 2. 2018-05-16
7 ID_3 2018-03-23 3. 2018-03-24
8 ID_3 2018-03-23 3. 2018-03-25
9 ID_3 2018-03-23 3. 2018-03-26
10 ID_4 2018-04-10 5. 2018-04-11
11 ID_4 2018-04-10 5. 2018-04-12
12 ID_4 2018-04-10 5. 2018-04-13
13 ID_4 2018-04-10 5. 2018-04-14
14 ID_4 2018-04-10 5. 2018-04-15
15 ID_5 2018-03-03 2. 2018-03-04
16 ID_5 2018-03-03 2. 2018-03-05