考虑以下矩阵:
mat = rbind(c(".","2","3","4","5","6"),
c(".","2","3","7","8","1"),
c(".","2","3","7","9","2"))
我想找到所有元素不同的第一列的索引。在这种情况下,结果应为 5 。如您所见,第五列是所有元素不同的第一列。
实际上,矩阵的尺寸非常大。
是否有一种简单的方法可以检索所有元素不同的第一列的索引?
谢谢!
答案 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))