如何用R的dplyr包按站点和坐标范围匹配数据集并提取jph值?
用R的dplyr包实现站点内坐标范围匹配提取数据
需求说明
我有两个数据集,均包含site、x、y列:
- 数据集A额外包含
jph列 - 数据集B额外包含
xplus1、xminus1、yplus1、yminus1和尺寸分类列(示例中为fish_length)
需要针对每个站点,当数据集A的x、y坐标处于数据集B的xminus1至xplus1、yminus1至yplus1范围内时,提取数据集A的jph值,同时保留数据集B的site列和尺寸分类列。
示例数据集
datasetA <- data.frame( site = c('Site1', 'Site2', 'Site3'), x = c(1, 5, 9), y = c(2, 6, 10), jph = c(100, 200, 300) ) datasetB <- data.frame( site = c('Site1', 'Site2', 'Site3'), xplus1 = c(2, 6, 10), xminus1 = c(0, 4, 8), yplus1 = c(3, 7, 11), yminus1 = c(1, 5, 9), fish_length = c(15, 25, 35) )
解决方案代码
加载dplyr包后,通过三步实现需求:
- 按
site关联两个数据集,确保仅匹配同一站点的数据 - 筛选出A的坐标落在B对应范围的行
- 保留所需列
library(dplyr) # 执行匹配提取 result <- datasetB %>% inner_join(datasetA, by = "site") %>% filter(x >= xminus1 & x <= xplus1, y >= yminus1 & y <= yplus1) %>% select(site, fish_length, jph) # 查看结果 print(result)
代码说明
inner_join(..., by = "site"):按站点合并两个数据集,确保跨站点的数据不会被错误匹配filter(...):设置坐标范围筛选条件,仅保留符合范围要求的行select(...):提取最终需要的列,剔除中间过程产生的冗余列
运行上述代码后,输出结果如下:
site fish_length jph 1 Site1 15 100 2 Site2 25 200 3 Site3 35 300
如果需要保留数据集B的所有行(即使没有匹配到数据集A的有效坐标),只需将inner_join替换为left_join,未匹配到的jph值会显示为NA。
内容的提问来源于stack exchange,提问作者vermicellion
相关产品推荐
相关产品推荐

