我有以下矩阵:
[,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中有一种简单的方法吗?
由于
答案 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)))]