R:如何在一列中创建多个新值,并使用其他列中的数据为每个新值重复一行?

R:如何在一列中创建多个新值,并使用其他列中的数据为每个新值重复一行?,r,R,我有如下数据: 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

我有如下数据:

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           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
我想创建一个新表,如下所示:

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           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,是否有任何简单的方法可以做到这一点。 我绝对不想对循环使用
(对于大数据来说太长)和
seq\u

我想首先创建一个列,将每行的所有可能值粘贴在一起,这样我们就可以得到例如
y='2018-02-07;2018-02-08;2018-02-09;2018-02-10’
第一行,然后进行
整形(dcast)
分隔行
。 我的代码如下所示:

data_t2 <- data_t %>%
 mutate(
   y = paste0(as.Date(date)+1:ndays, collapse = ";")
 ) %>%
 separate_row(y, sep = ";\\s+")
数据\u t2%
变异(
y=paste0(as.Date(Date)+1:ndays,collapse=“;”)
) %>%
分隔_行(y,sep=“;\\s+”)
问题是,对于R来说,
data\u$date
是一个向量,由于它不单独处理每一行,因此需要通过立即处理向量
data\u$date
来创建一个新的向量
y
,并且不知道要引用的
data\u$ndays
的哪个值。我们会遇到向量长度一致性问题

有人有主意吗


提前感谢

我们应该能够在
dplyr
tidyr

使用
tidyr::uncount
,我们可以通过根据
ndays
复制行来重新格式化数据。 接下来,我们将根据
identifiant
对数据进行分组(或者同时根据
identifiant
date
对数据进行分组,具体取决于
identifiant
是否唯一)。 最后,我们将使用
mutate
来确保
date
字段的类别正确,然后在组内添加行号(每个组的行号类似于
1:ndays

library(dplyr)
library(tidyr)

data_t %>% 
  uncount(ndays, .remove = FALSE) %>% 
  group_by(identfiant) %>% 
  mutate(date = as.Date(date),
         y = date + row_number())
三分之三的非代码进近:
df.expanded%
分组人(识别人)%>%
变异(日期=as.date(日期),
y=日期+行号()
无论哪种方式,这两种方法都为我们提供了以下信息:

# 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
#一个tible:16 x 4
#组:标识符[5]
识别日期星期日
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

非常感谢。我非常喜欢你的答案。但不幸的是,我使用的服务器有一个较旧版本的
tidyr
(v0.6.0)其中不存在函数
uncount
dos!我将继续搜索,以便找到解决方案。再次感谢。为您添加了一个避免
tidyr
的替代方案。我假设您仍然可以使用
dplyr
,因为您在原始问题中包含了
dplyr
语法是的,非常感谢!第二个解决方案有效!