我认为这可能是一个重复的问题,但我找不到答案,所以在这里。如果我有一个矩阵X:
> X
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 55 1 8
[2,] 48 2 0 1 2
[3,] 67 23 53 55 78
[4,] 0 78 0 0 0
[5,] 85 91 23 65 83
获取行索引的最简单方法是哪一个条目为非零,其他条目为零?我试过了:
test <- which(X[,2] != 0 & X[,-2] == 0)
理想情况下,我希望结果如下:4。但是,这不是发生的事情......我得到which()
给我索引(行和列)所以它可能不是解决这个问题的方法......有什么想法吗?
提前致谢!
答案 0 :(得分:2)
X <- as.matrix(read.table(text="
1 4 55 1 8
48 2 0 1 2
67 23 53 55 78
0 78 0 0 0
85 91 23 65 83"))
which(rowSums(X!=0)==1)
# [1] 4
以下两种方法可以纠正您的方法,请注意他们专注于观察第2列而我的解决方案没有:
which(X[,2] != 0 & rowSums(X[,-2] != 0)==0) # [1] 4
which(X[,2] & !apply(X[,-2],1,any,0)) # [1] 4
你的方法失败了,因为X[,-2] == 0
是一个布尔矩阵,而不是你想要的向量。
如果您想分别对所有列执行此操作,可以使用lapply
:
lapply(seq(ncol(X)),function(i) which(X[,i] != 0 & rowSums(X[,-i] != 0)==0))
答案 1 :(得分:1)
试试这个简单的示例代码:
m<-as.matrix(cbind(a=c(1,1,1,0,0,1),b=c(1,1,1,1,0,0),c=c(1,1,1,0,0,0)))
> m
a b c
[1,] 1 1 1
[2,] 1 1 1
[3,] 1 1 1
[4,] 0 1 0
[5,] 0 0 0
[6,] 1 0 0
>
> #Row detection
> which(rowSums(m!=0)==1)
[1] 4 6
>
> #Column with elemnte !=0
> apply(m[which(rowSums(m!=0)==1),],1,which.max)
[1] 2 1