代码之家  ›  专栏  ›  技术社区  ›  jakes

向数据帧添加中间观测值(手动插值)

  •  1
  • jakes  · 技术社区  · 7 年前

    我有一个数据框,如下图所示,带有向量坐标:

    df <- structure(list(x0 = c(22.6, 38.5, 73.7), y0 = c(62.9, 56.6, 27.7
    ), x1 = c(45.8, 49.3, 80.8), y1 = c(69.9, 21.9, 14)), row.names = c(NA, 
    -3L), class = c("tbl_df", "tbl", "data.frame"))
    # A tibble: 3 x 4
         x0    y0    x1    y1
      <dbl> <dbl> <dbl> <dbl>
    1  22.6  62.9  45.8  69.9
    2  38.5  56.6  49.3  21.9
    3  73.7  27.7  80.8  14 
    

    出于可视化目的,我需要手动插值点,即在每两行数据之间添加一个中间行 df ,起始坐标在哪里 x0, y0 是原始上一行的结束坐标,而结束坐标 x1, y1 是原始的下一行的起始坐标。如果观察结果来自原始数据集或是手动添加的,我还需要保留信息。因此,预期的产出将是:

    # A tibble: 5 x 5
          x     y pass_end_x pass_end_y source  
      <dbl> <dbl>      <dbl>      <dbl> <chr>   
    1  22.6  62.9       45.8       69.9 original
    2  45.8  69.9       38.5       56.6 added   
    3  38.5  56.6       49.3       21.9 original
    4  49.3  21.9       73.7       27.7 added   
    5  73.7  27.7       80.8       14   original
    

    我怎样才能高效优雅地做到这一点(最好是在 tidyverse )?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mako212    7 年前

    为此,我要做的就是交换起点和终点的列名,然后使用 lead 以获取的下一个值 x1 y1 .然后我们只需添加 source 标签,和 bind_rows

    library(tidyverse)
    
    df2 <- df
    
    names(df2) <- names(df2)[c(3,4,1,2)] # swap names
    
    df2 <- df2 %>% mutate(x1 = lead(x1), y1 = lead(y1),source = "added")
    
    df <- df %>% mutate(source = "original") %>% bind_rows(., df2)
    

    导致:

    # A tibble: 6 x 5
         x0    y0    x1    y1 source  
      <dbl> <dbl> <dbl> <dbl> <chr>   
    1  22.6  62.9  45.8  69.9 original
    2  38.5  56.6  49.3  21.9 original
    3  73.7  27.7  80.8  14   original
    4  45.8  69.9  38.5  56.6 added   
    5  49.3  21.9  73.7  27.7 added   
    6  80.8  14    NA    NA   added  
    

    如果需要按顺序排列这些行:

    df2 <- df2 %>% mutate(x1 = lead(x1), y1 = lead(y1),source = "added", ID = seq(1,n()*2, by =2)+1)
    
    df <- df %>% mutate(source = "original", ID = seq(1,n()*2, by =2)) %>% bind_rows(., df2) %>% arrange(ID)
    
    # A tibble: 6 x 6
         x0    y0    x1    y1 source      ID
      <dbl> <dbl> <dbl> <dbl> <chr>    <dbl>
    1  22.6  62.9  45.8  69.9 original     1
    2  45.8  69.9  38.5  56.6 added        2
    3  38.5  56.6  49.3  21.9 original     3
    4  49.3  21.9  73.7  27.7 added        4
    5  73.7  27.7  80.8  14   original     5
    6  80.8  14    NA    NA   added        6