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

R语言按ID和Size分组对数据集指定列计算3D点方差方法咨询

3D点方差分组计算实现方案

前置定义函数

你已定义的3D点方差计算函数如下:

centroid_3d_sq_dist <- function(
    point_matrix
) {
  
  if (nrow(point_matrix) == 1) {
    return(0)
  }
  mean_point <- apply(point_matrix, 2, mean)
  
  point_sq_distances <- apply(
    point_matrix,
    1,
    function(row_point) {
      sum((row_point - mean_point) ** 2)
    }
  )
  sum_sq_distances <- sum(point_sq_distances)
  return(sum_sq_distances)
}

point_3d_variance <- function(
    point_matrix
) {
  if (nrow(point_matrix) == 1) {
    return(0)
  }
  dist_var <- centroid_3d_sq_dist(point_matrix) /
    (nrow(point_matrix) - 1)
  return(dist_var)
}

函数入参要求为(x,y,z)格式的3列矩阵。

数据集说明

现有数据集结构如下:

ID     Trial Size   PP    PA   FkA ciccioX ciccioY ciccioZ pinoX  pinoY   pinoZ
1 Gigi     1   40    39.6  1050. 31.5    521.   293.   10.6   516.   323.   6.41
2 Gigi     2   20.0  30.7  944.  9.35   525.   300.   12.6   520.   305.   7.09
3 Gigi     3   30    29.5  1056. 24.1    521.   298.   12.3   519.   321.   5.89
4 Gigi     5   60    53.0  1190. 53.0    680.   287.   64.4   699.   336.  68.6 
5 Bibi     1   40    38.3  1038. 31.4    524.   289.   10.9   519.   319.   6.17
6 Bibi     2   60    64.7  1293. 47.8    516.   282.   10.4   519.   330.   6.32
7 Bibi     3   20.0  33.8  1092. 17.5    523.   300.   12.8   518.   315.   6.22
8 Bibi     4   30    35.0  1108. 26.4    525.   295.   11.7   517.   320.   5.78
9 Bibi     5   50    46.5  1199. 34.2    515.   289.   11.2   517.   323.   6.27
10 Bibi    6   30    28.7  1016. 17.1    528.   298.   12.7   524.   314.   6.36

其中两组3D点对应关系为:ciccio对应ciccioX、ciccioY、ciccioZ三列,pino对应pinoX、pinoY、pinoZ三列。

需求与问题说明

需求为按ID和Size字段分组,分别计算每个分组内ciccio和pino的3D点方差。
原错误写法如下:

data %>%
  group_by(SubjectID, Size) %>%
  summarize(as.data.frame(matrix(f4(dd[7:9],dd[10:12]), nr = 1)))

错误原因包括:

  • 分组字段SubjectID不存在于数据集,实际分组字段为ID
  • 未正确将坐标列拼接为符合要求的矩阵传入方差计算函数
  • 输出结构定义不清晰导致运行报错

修正后实现代码

library(dplyr)

result <- data %>%
  group_by(ID, Size) %>%
  summarize(
    ciccio_variance = point_3d_variance(as.matrix(cbind(ciccioX, ciccioY, ciccioZ))),
    pino_variance = point_3d_variance(as.matrix(cbind(pinoX, pinoY, pinoZ))),
    .groups = "drop"
  )

实现逻辑说明:

  1. 分组时使用数据集实际存在的ID和Size字段
  2. 对每组的ciccio、pino坐标分别用cbind拼接后转换为3列矩阵,传入提前定义好的point_3d_variance函数计算方差
  3. 明确指定输出列名,新增.groups = "drop"参数关闭结果的分组属性,方便后续处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:04