R语言expand.grid坐标组合结果逐行求x最大值与y最小值方法
实现思路与代码方案
核心逻辑
- 你生成的组合表每一列对应一组(x,y)坐标的二选一结果,首先需要提前记录4组各自的x、y固定取值,用于判断每行每个元素属于x集合还是y集合
- 逐行筛选出所有x类元素取最大值,所有y类元素取最小值,作为新列追加到结果表即可
修改后的可运行代码
intervals <- function(x1,y1,x2,y2,x3,y3,x4,y4){ # 存储4组各自的x、y对照值 group_ref <- list( c(x = x1, y = y1), c(x = x2, y = y2), c(x = x3, y = y3), c(x = x4, y = y4) ) # 生成所有组合 res_df <- expand.grid(a = group_ref[[1]], b = group_ref[[2]], c = group_ref[[3]], d = group_ref[[4]]) # 逐行计算x最大值 res_df$x_max <- apply(res_df, 1, function(row_item) { x_list <- c() for (idx in 1:4) { if (row_item[idx] == group_ref[[idx]]["x"]) x_list <- c(x_list, row_item[idx]) } max(x_list) }) # 逐行计算y最小值 res_df$y_min <- apply(res_df, 1, function(row_item) { y_list <- c() for (idx in 1:4) { if (row_item[idx] == group_ref[[idx]]["y"]) y_list <- c(y_list, row_item[idx]) } min(y_list) }) return(res_df) } # 测试调用 intervals(2,10,3,90,6,50,82,7)
结果验证
运行上述代码后,你提到的第2行结果会输出x_max=82、y_min=10,完全符合你的计算要求。如果需要更高的运行效率,也可以替换apply循环为向量化运算实现,上述写法逻辑清晰方便理解。
内容的提问来源于stack exchange,提问作者Dihan
相关产品推荐
相关产品推荐

