r - 将中间观测值添加到数据框(手动插值)
问题描述
我有一个带有矢量坐标的数据框,如下所示:
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
)做到这一点?
解决方案
为此,我要做的就是交换起点和终点的列名,然后用于lead
获取x1
and的下一个值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
推荐阅读
- jquery - 使用 jQuery 2.3 与 3.3 更改元素 CSS 高度
- javascript - 使用 JavaScript 将匹配的 HTML 标记替换为 Regexp
- python - 为什么 Python 描述符适用于类级别属性而不适用于实例级别属性
- javascript - 尝试分配多个 onfocus 事件
- vue.js - 如何从方法访问 vue 重复项键
- firebase - 在 .then() 中调用函数会引发错误
- java - Gson Parsing Collection
- python-3.x - pyppeteer script crashing after pressing Ctrl+C
- c# - Cross-Platform encryption for Database
- php - PHP header(Location:...) not working