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" )
实现逻辑说明:
- 分组时使用数据集实际存在的
ID和Size字段 - 对每组的ciccio、pino坐标分别用
cbind拼接后转换为3列矩阵,传入提前定义好的point_3d_variance函数计算方差 - 明确指定输出列名,新增
.groups = "drop"参数关闭结果的分组属性,方便后续处理
内容的提问来源于stack exchange,提问作者Cecca80
相关产品推荐
相关产品推荐

