在R中查找特定列的索引

时间:2013-12-19 18:27:57

标签: r matrix

考虑以下矩阵:

 mat = rbind(c(".","2","3","4","5","6"), 
             c(".","2","3","7","8","1"), 
             c(".","2","3","7","9","2"))

我想找到所有元素不同的第一列的索引。在这种情况下,结果应为 5 。如您所见,第五列是所有元素不同的第一列。

实际上,矩阵的尺寸非常大。

是否有一种简单的方法可以检索所有元素不同的第一列的索引?

谢谢!

6 个答案:

答案 0 :(得分:5)

您也可以使用all(!duplicated(x))代替anyDuplicated,例如:

which(apply(mat, 2, anyDuplicated) == 0)[1]
[1] 5

根据?anyDuplicated,它应该更有效率:

  

'anyDuplicated(。)'是一个“通用”更有效的快捷方式        “任何(重复(。))”

答案 1 :(得分:4)

这是另一种选择

> which(apply(mat, 2, function(x) all(!duplicated(x)))==TRUE)[1]
[1] 5

答案 2 :(得分:3)

您可以避免将所有列转换为逻辑列,然后选择 first TRUE。你可以使用一个简单的for循环和break包含在这样的函数中:

findfirst <- function(mat)
{
 for(i in seq_len(ncol(mat))) {
    if(!anyDuplicated(mat[,i])) break 
 }
 return(i)
}
findfirst(mat)
#[1] 5

答案 3 :(得分:2)

您正在寻找的工具是apply()和unique()。 我的解决方案检查哪个矩阵的长度正确:

apply(mat, 2, function(x) length(unique(x))==length(x))

如果您想使用它来获取第一个完整列,

answers<-mat[,apply(mat, 2, function(x) length(unique(x))==length(x))]
answers[,1]

答案 4 :(得分:2)

我会做类似的事情:

which(apply(mat, 2, function(x) all(!duplicated(x))))[1]
[1] 5

答案 5 :(得分:0)

所有其他解决方案都比我的好,但我想我还是会发布我的丑陋答案。

min(which(lapply(sapply(apply(mat,2,rle),'[[',1),function(x)all(x==1))==T))