R - 按重复值过滤矩阵

时间:2015-03-20 02:24:27

标签: r matrix

我有以下矩阵:

      [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    1    3    5    1
[2,]    3    5    4    6    7    2

我需要过滤此矩阵,以便删除第1行中包含重复元素的列,只留下第2行中包含最大值的列。因此,在此示例中,第1列和第1列需要删除6个输入矩阵:

      [,1] [,2] [,3] [,4]
[1,]    2    1    3    5
[2,]    5    4    6    7

在R中有一种简单的方法吗?

由于

2 个答案:

答案 0 :(得分:5)

您可以计算每个第一行元素的最大第二行值,然后只保留第二行是第一行中元素的最大值的列:

(maxes <- tapply(mat[2,], mat[1,], max))
# 1 2 3 5 
# 4 5 6 7 
(mat2 <- mat[,maxes[as.character(mat[1,])] == mat[2,]])
#      [,1] [,2] [,3] [,4]
# [1,]    2    1    3    5
# [2,]    5    4    6    7

如果您希望第二行中的最大值具有关联,并且想要删除重复的列,则可以在这两个命令之后使用mat2[!duplicated(mat2[,1]),]

答案 1 :(得分:2)

您可以使用ave

 res <- mat[,!!ave(mat[2,], mat[1,], FUN=function(x) x==max(x))]
 res
 #     [,1] [,2] [,3] [,4]
 #[1,]    2    1    3    5
 #[2,]    5    4    6    7

注意:如果数据集中存在关联,则可以通过

删除这些列
 res[,!duplicated(split(res, col(res)))]