R语言purrr包map()处理嵌套数据时如何传入动态可变参数
核心思路
你需要同时迭代每个id对应的家域对象hr1和每个id对应的观测数n两个变量,因此不用单参数的map(),改用purrr提供的双参数迭代函数map2()即可实现动态传参。
最小修改方案(基于你现有代码)
先将你计算好的观测数表id_n和家域表trk1按id对齐合并,再调用map2()迭代:
# 合并观测数到主表,保证id一一对应 trk1 <- trk1 %>% left_join(id_n, by = "id") # 动态传入n生成对应数量的随机点 trk_id <- trk1 %>% mutate(random_used = map2(hr1, n, ~random_points(.x, n = .y)))
更简洁的全流程优化方案
你原来用循环计算每个id观测数的步骤可以完全省略,在数据嵌套时直接统计即可,代码更简洁不易出错:
library(purrr) library(amt) library(tidyverse) trk <- amt_fisher %>% make_track(x_, y_, t_, id = id) # 嵌套数据同时直接计算每个id的观测数,无需额外循环 data <- trk %>% nest(dat = -"id") %>% mutate(n = map_int(dat, nrow)) # 批量计算每个id的家域 trk1 <- data %>% mutate( hr = map(dat, ~hr_kde(., levels = 0.95)), hr1 = map(hr, hr_isopleths) ) # 动态传参生成随机点 trk_id <- trk1 %>% mutate(random_used = map2(hr1, n, ~random_points(.x, n = .y)))
补充说明
map2()接收两个长度相同的输入序列,迭代时每次取两个序列对应位置的值,分别传给函数内的.x(对应hr1)和.y(对应n),刚好匹配你每个id的家域和观测数一一对应的需求。- 如果后续需要迭代3个及以上参数,可使用purrr的
pmap()函数实现多参数动态传入。
内容的提问来源于stack exchange,提问作者Sas
相关产品推荐
相关产品推荐

