2017-09-18 77 views
1

我有看起来像这样的数据帧添加行数据帧:通过顺序填充和重复值

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开始并结束于每个originalID的最大值newTime。我想重复其他列的值,但从0到第一个newTime,我想重复originalID中的值。

非常感谢您的帮助!

回答

2

试试这个〜(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