Добавление промежуточных наблюдений во фрейм данных (ручная интерполяция) - PullRequest
0 голосов
/ 18 января 2019

У меня есть кадр данных, как показано ниже, с векторными координатами:

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 Ответ

0 голосов
/ 18 января 2019

Для этого все, что я собираюсь сделать, это поменять местами имена столбцов начальной и конечной точек, а затем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...