如何在dodgr生成的出行时间矩阵中找出1小时可达的MSOA目的地?
获取1小时内可达的MSOA ID/名称解决方案
你可以通过逐行筛选出行时间矩阵中满足条件的列,提取对应的MSOA标识,以下是两种实用方法:
方法一:Base R 实现
假设odtwalk矩阵的列名就是MSOA的ID/名称,或者destination数据框的行顺序与矩阵列顺序一致且包含MSOA标识列(比如msoa_id),可以用apply函数逐行处理:
# 情况1:矩阵列名直接是MSOA ID LSOA_Bromley$reachable_msoas <- apply(odtwalk <= 3600, 1, function(x) { colnames(odtwalk)[x] # 筛选出行时间<=3600的列名 }) # 情况2:从destination数据框提取MSOA ID(需保证destination行顺序与矩阵列顺序一致) LSOA_Bromley$reachable_msoas <- apply(odtwalk <= 3600, 1, function(x) { destination$msoa_id[x] # 替换为你的MSOA标识列名 })
执行后,LSOA_Bromley会新增reachable_msoas列,这是一个列表列,每个元素对应一个起点可达的MSOA标识向量。
方法二:Tidyverse 风格实现
如果习惯用dplyr和purrr的tidy语法,也可以这样写:
library(dplyr) library(purrr) # 将矩阵转为数据框(保留列名) odt_df <- as.data.frame(odtwalk) # 逐行筛选并提取MSOA标识 LSOA_Bromley <- LSOA_Bromley %>% mutate( reachable_msoas = map(row_number(), ~{ colnames(odt_df)[odt_df[.x, ] <= 3600] # 若需从destination提取,替换为:destination$msoa_id[odt_df[.x, ] <= 3600] }) )
可选:转为字符串格式
如果需要将列表转为逗号分隔的字符串方便查看,可添加以下代码:
LSOA_Bromley$reachable_msoas_str <- sapply(LSOA_Bromley$reachable_msoas, paste, collapse = ", ")
内容的提问来源于stack exchange,提问作者yuyumew
相关产品推荐
相关产品推荐

