R语言对数据框嵌套列表应用make_track函数报错如何解决?
报错原因
- 遍历对象错误:直接对
nested嵌套tibble执行lapply,该对象仅包含ID、data两列,遍历得到的元素不存在x/y/date等字段,触发列不存在报错 - 参数传入错误:
make_track的.x参数被误写为迭代变量x,实际应为数据框中代表横坐标的列名x - 字段缺失:调用
make_track时指定了uid=ID,但data列下的子数据框不含ID字段,ID是外层tibble的分组列,需要手动传入内层 - 数据结构适配问题:自定义的
f函数通过group_split将每个ID对应的数据集拆分为了按10天分组的子数据框列表,因此每个ID下的data是二级嵌套结构,需要双层遍历才能拿到最内层的子数据框执行make_track
修复方案
可以用双层lapply实现,也可以用tidyverse生态的嵌套map写法更简洁易读,两种修复后的代码如下:
方案1:tidyverse 嵌套map(推荐)
set.seed(12345) library(lubridate) library(dplyr) library(purrr) library(amt) f = function(data){ data %>% mutate( new = floor_date(data$date, "10 days"), new = if_else(day(new) == 31, new - days(10), new) ) %>% group_split(new) } nested <- tibble( ID = rep(c("A","B","C","D", "E"), 100), date = rep_len(seq(dmy("01-01-2010"), dmy("31-12-2013"), by = "days"), 500), x = runif(length(date), min = 60000, max = 80000), y = runif(length(date), min = 800000, max = 900000) ) %>% group_by(ID) %>% nest() %>% mutate(data = map(data, f)) # 嵌套生成track,保留原结构 nested <- nested %>% mutate(tracks = map2(data, ID, ~ map(.x, function(sub_df) { # 把ID传入子数据框用于uid字段生成 sub_df$ID <- .y make_track( tbl = sub_df, .x = x, .y = y, .t = date, uid = ID, crs = sp::CRS("+init=epsg:32612") ) }))) # 如需提取为一维列表直接使用 track_list <- flatten(nested$tracks)
方案2:base R 双层lapply
track_list <- lapply(seq_len(nrow(nested)), function(i) { id <- nested$ID[i] id_data <- nested$data[[i]] lapply(id_data, function(sub_df) { sub_df$ID <- id make_track( tbl = sub_df, .x = x, .y = y, .t = date, uid = ID, crs = sp::CRS("+init=epsg:32612") ) }) }) # 打平为一维列表可选 track_list <- unlist(track_list, recursive = FALSE)
内容的提问来源于stack exchange,提问作者John Huang
相关产品推荐
相关产品推荐

