如何在DataFrame中按指定类别筛选并获取分组最小距离及对应站点
解决方法
要实现每个GridID.1站点对应最近的GridID.2站点及最短距离,同时输出类别标识,你可以用dplyr的slice_min函数保留分组中距离最小的完整行,而非只提取数值。修改后的代码如下:
library(dplyr) # 读取数据 data <- read.csv("testsites.csv", header=TRUE) # 筛选类别、分组取最小距离行、添加类别标识 df <- data %>% # 筛选GridID.1.binned_temp为1的记录 filter(GridID.1.binned_temp == 1) %>% # 按GridID.1分组 group_by(GridID.1) %>% # 提取每组中Distance.m.最小的1行,with_ties=FALSE避免多个相同最小距离的记录(按需调整) slice_min(Distance.m., n = 1, with_ties = FALSE) %>% # 取消分组状态 ungroup() %>% # 添加类别标识列 mutate(category = "temp1") %>% # 按需求选择并排列输出列 select(category, GridID.1, GridID.2, Distance.m.)
代码说明:
slice_min:替代原来的summarize,直接保留每个分组中距离最小的完整记录,这样就能拿到对应的GridID.2站点IDwith_ties = FALSE:如果同一个GridID.1存在多个GridID.2距离相同且都是最小值,只保留其中一行;如果需要保留所有这类记录,去掉这个参数即可mutate(category = "temp1"):手动添加类别标识列,明确输出的是GridID.1.binned_temp == 1的分组结果select:调整输出列的顺序,匹配你需要的字段:类别标识、GridID.1站点ID、最近的GridID.2站点ID、最短距离
原代码问题:
你原来的代码在summarize中错误地将GridID.1赋值为min(Distance.m.),这会把站点ID覆盖成距离数值,导致输出只有距离,丢失了站点关联信息。
内容的提问来源于stack exchange,提问作者Katherine Chau
相关产品推荐
相关产品推荐

