在df的当前值之间插入后续值(行)

时间:2019-04-08 08:39:59

标签: r dataframe

让我们创建一个简单的df:

col1 <- runif(n = 10, min = 0.1, max = 1)
col2 <- c(1,3,5,8,19,21,34,41,45,46)
col3 <- c('A','B','C','D','E','F','G','H','I','J')
df <- data.frame(col1, col2, col3)
df
        col1 col2 col3
1  0.4715977    1    A
2  0.8364755    3    B
3  0.2936675    5    C
4  0.5438777    8    D
5  0.3691008   19    E
6  0.6030533   21    F
7  0.5171806   34    G
8  0.4804162   41    H
9  0.3031454   45    I
10 0.8507250   46    J

关于col2的后续值,我想在col2的数值之间添加带有零和NA的行,所以在第1行和第2行之间,我想在col2中再增加一行2的值,例如这个:

        col1 col2 col3
1  0.4715977    1    A
2         0     2    NA
2  0.8364755    3    B

总结整个df应该如下:

            col1 col2 col3
    1  0.4715977    1    A
    2          0    2    NA
    3  0.8364755    3    B
    4          0    4    NA
    5  0.2936675    5    C
    6          0    6    NA
    7          0    7    NA
    8  0.5438777    8    D
    9          0    9    NA
    10         0    10   NA
    11         0    11   NA
    12         0    12   NA
    13         0    13   NA
    14         0    14   NA
    15         0    15   NA
    16         0    16   NA
    17         0    17   NA
    18         0    18   NA
    19 0.3691008    19   E
    20         0    20   NA
    21 0.6030533    21   F
    22         0    22   NA
    23         0    23   NA
    24         0    24   NA
    25         0    25   NA
    26         0    26   NA
    27         0    27   NA
    28         0    28   NA
    29         0    29   NA
    30         0    30   NA
    31         0    31   NA
    32         0    32   NA
    33         0    33   NA
    34 0.5171806    34   G
    35         0    35   NA
    36         0    36   NA
    37         0    37   NA
    38         0    38   NA
    39         0    39   NA
    40         0    40   NA
    41 0.4804162    41   H
    42         0    42   NA
    43         0    43   NA
    44         0    44   NA
    45 0.3031454    45   I
    10 0.8507250    46   J

您能给我一个提示,以简单的方式做到这一点,我在考虑dplyr ...

1 个答案:

答案 0 :(得分:2)

使用tidyr,您可以执行以下操作:

complete(df, col2 = seq(min(col2), max(col2), 1), fill = list(col1 = 0))

    col2  col1 col3 
   <dbl> <dbl> <fct>
 1     1 0.191 A    
 2     2 0     <NA> 
 3     3 0.638 B    
 4     4 0     <NA> 
 5     5 0.908 C    
 6     6 0     <NA> 
 7     7 0     <NA> 
 8     8 0.995 D    
 9     9 0     <NA> 
10    10 0     <NA>