行索引,其中一列具有非零条目

时间:2018-05-22 10:13:24

标签: r indexing row

我认为这可能是一个重复的问题,但我找不到答案,所以在这里。如果我有一个矩阵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()给我索引(行和列)所以它可能不是解决这个问题的方法......有什么想法吗?

提前致谢!

2 个答案:

答案 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
相关问题