通过填充序列和重复值将行添加到数据框

时间:2017-09-18 19:19:27

标签: r

我有一个如下所示的数据框:

originalID <- c('A','A','B','B','B','B')
newID <- c('D','G','R','Q','N','P')
newTime <- c(2,4,3,6,7,10)

x <- data.frame(originalID, newID, newTime)

x
  originalID newID newTime
1          A     D       2
2          A     G       4
3          B     R       3
4          B     Q       6
5          B     N       7
6          B     P      10

我想要的结果是一个如下所示的数据框:

   originalID newID newTime
1           A     A       0
2           A     A       1
3           A     D       2
4           A     D       3
5           A     G       4
6           B     B       0
7           B     B       1
8           B     B       2
9           B     R       3
10          B     R       4
11          B     R       5
12          B     Q       6
13          B     N       7
14          B     N       8
15          B     N       9
16          B     P      10

基本上,我尝试在newTime的每个值之前和之间填写序列,从0开始,到每个newTime的最大值originalID结束。我想重复其他列的值,除了从0到第一个newTime,我想要重复originalID的值。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

试试这个〜(PS也可以在你的df中添加stringsAsFactors=F

数据输入

x <- data.frame(originalID, newID, newTime,stringsAsFactors = F)

解决方案

library(tidyr)
library(zoo)
library(dplyr)
x=x %>% group_by(originalID) %>% complete(newTime=full_seq(0:max(newTime),1))
x=x %>% group_by(originalID)%>%mutate(newID=zoo::na.locf(newID,na.rm = F))

x$newID[is.na(x$newID)]=x$originalID[is.na(x$newID)]

x
# A tibble: 16 x 3
# Groups:   originalID [2]
   originalID newTime newID
        <chr>   <dbl> <chr>
 1          A       0     A
 2          A       1     A
 3          A       2     D
 4          A       3     D
 5          A       4     G
 6          B       0     B
 7          B       1     B
 8          B       2     B
 9          B       3     R
10          B       4     R
11          B       5     R
12          B       6     Q
13          B       7     N
14          B       8     N
15          B       9     N
16          B      10     P