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

如何在R中使用spatstat创建按sim分组的ppp对象列表?

解决方案

你出错的核心原因是混用了dplyr分组语法和base R的迭代函数,且迭代时调用的是全量数据集而非分组后的数据,以下是可直接运行的修复代码:

library(tidyverse)
library(spatstat)

set.seed(23)

x <- runif(1000)*1000
y <- runif(1000)*1000
sim <- rep(1:10, 100)
coordinates <- data.frame(x, y, sim)

# 方法1:tidyverse路径,符合你原本的代码习惯
ppp_list <- coordinates %>% 
  group_nest(sim) %>% # 按sim分组,每组数据存为嵌套列表
  pull(data) %>% # 提取所有分组的数据列表
  map(~ ppp(x = .x$x, y = .x$y, xrange = c(0,1000), yrange = c(0,1000))) # 迭代生成ppp对象

# 方法2:base R路径,写法更简洁
coordinates_split <- split(coordinates, coordinates$sim)
ppp_list <- lapply(coordinates_split, function(df) ppp(df$x, df$y, xrange = c(0,1000), yrange = c(0,1000)))

运行后调用ppp_list[[1]]即可得到你需要的输出格式,每个元素都是对应sim分组的平面点模式对象。


你之前代码的错误说明

  1. 语法逻辑错误:group_by()生成的是分组tibble,不能直接接lapply()/apply()。管道语法默认会把左侧的运行结果作为右侧函数的第一个参数,你写的coordinates%>%group_by(sim)%>%lapply(coordinates,function(x)...)等价于lapply(group_by(coordinates,sim), coordinates, function(x)...),lapply第二个参数本该是迭代函数,你传了coordinates数据框,R会尝试把coordinates当作函数调用,找不到就抛出你看到的第一个报错。
  2. 取值逻辑错误:迭代函数里调用的是coordinates$x/coordinates$y,这是全量数据集的坐标,不是分组后的坐标,就算语法修复也得不到正确的分组结果。
  3. 冗余逻辑:不需要提前创建空列表填充,迭代函数本身会直接返回生成的列表。

内容的提问来源于stack exchange,提问作者OpenSauce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:48:03