如何用自定义AbsDiff函数比较向量元素对,筛选符合条件的元素?
解决方案
首先先确认我们的基础数据和自定义函数:
v <- c(1,2,5,6,8,10,15,16) AbsDiff <- function(x,y){ abs(x-y) }
下面是两种满足需求的实现方式,都会对每个元素调用AbsDiff和其他所有元素进行比较:
方法1:逐个元素检查(sapply实现)
我们可以用sapply遍历向量中的每个元素,针对每个元素,排除它自身后,检查剩余元素里是否存在和它的绝对差为1的项:
# 生成筛选逻辑向量 keep_elements <- sapply(v, function(current_val) { # 取出除当前元素外的所有值 other_vals <- v[v != current_val] # 检查是否有任意一个值满足AbsDiff等于1 any(AbsDiff(current_val, other_vals) == 1) }) # 应用筛选逻辑得到结果 result <- v[keep_elements] print(result) # 输出:[1] 1 2 5 6 15 16
方法2:批量生成差值矩阵(outer+apply实现)
利用outer函数可以一次性生成所有元素对的绝对差值矩阵,再通过矩阵行判断来筛选元素:
# 生成所有元素对的绝对差值矩阵 diff_matrix <- outer(v, v, AbsDiff) # 将对角线(元素自身和自身的差值)设为NA,避免干扰判断 diag(diff_matrix) <- NA # 检查每行是否存在值为1的元素(忽略NA) keep_elements <- apply(diff_matrix, 1, function(row) any(row == 1, na.rm = TRUE)) # 筛选得到结果 result <- v[keep_elements] print(result) # 输出:[1] 1 2 5 6 15 16
两种方法都能得到你预期的结果,第一种更直观地逐个处理每个元素,第二种通过矩阵操作批量处理,在向量规模较大时效率会更有优势。
内容的提问来源于stack exchange,提问作者nadavb
相关产品推荐
相关产品推荐

