R语言如何保留向量/矩阵中仅出现一次的元素或列
R语言筛选矩阵中仅出现一次的列实现方法
基础duplicated函数默认仅标记重复项中第二次及之后出现的条目,不会标记首次出现的重复条目,unique则会保留重复项的首次出现版本,二者默认用法都无法直接剔除所有出现次数大于1的列,可通过双向重复判断的方式实现需求:
- 首先复现测试矩阵:
A<-t(matrix( c(0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0), 3, 6))
- 核心实现逻辑:分别从正向、反向按列判断重复值,只要某列在任意一次判断中被标记为重复,就说明该列出现次数大于1,予以剔除。完整代码如下:
# MARGIN=2指定按列做重复判断 # 正向判断:标记第二次及之后出现的重复列 dup_forward <- duplicated(A, MARGIN = 2) # 反向判断:标记倒序遍历下第二次及之后出现的重复列(正序下首次出现的重复列也会被标记) dup_backward <- duplicated(A, MARGIN = 2, fromLast = TRUE) # 保留所有未被标记为重复的列,drop=FALSE保证输出结果始终为矩阵格式 res <- A[, !(dup_forward | dup_backward), drop = FALSE]
- 运行结果验证:
执行代码后输出的res和预期结果完全一致:
> res [,1] [1,] 1 [2,] 0 [3,] 1 [4,] 1 [5,] 0 [6,] 0
如果需要精简代码,也可以直接写成单行调用形式:
res <- A[, !(duplicated(A, 2) | duplicated(A, 2, fromLast = TRUE)), drop = FALSE]
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

