You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:12:01