Индекс строки, где один столбец имеет ненулевую запись - PullRequest
0 голосов
/ 22 мая 2018

Я думаю, что это может быть повторяющийся вопрос, но я не могу найти ответ, так что вот оно.Если у меня есть матрица 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 голосов
/ 22 мая 2018

Попробуйте этот простой пример кода:

    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
0 голосов
/ 22 мая 2018
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 способа исправить ваш подход, обратите внимание, что они сосредоточены на наблюдении за колонкой 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...