Сравнивайте значения с заданным стандартным рядом построчно и пишите только 1 число для каждой строки (превышает / не превышает стандарт) - PullRequest
0 голосов
/ 23 октября 2019

У меня есть матрица с множеством строк. Скажем,

M = matrix(1:20, nrow = 4, ncol = 5)

И у меня есть пороговая переменная, например,

threshold = c(4,7,11,14,17)

Теперь я хочу, чтобы R сравнил каждую строку в матрице с этим пороговым значением по значению и сказал,хотя бы одно значение в этой строке превышает соответствующее значение этого порога. Т.е. M [1,1] следует сравнивать с порогом [1], M [1,2] с порогом [2] и т. Д.

В идеале я хотел бы иметь новую переменную, назовем ее check, только с 1 / ЛОЖЬ (по крайней мере 1 значение в строке превышает пороговое значение) или 0 / ИСТИНА (таких значений нет). До сих пор я мог запрограммировать следующее:

check = apply (M, MARGIN=1, (ifelse((M[,] < threshold), 1, 0)))

check = apply (check, MARGIN=1, sum)

check = check == 0

Но есть три проблемы:

  1. Может быть, это не лучший способ решить проблему? У меня много данных, и я думаю, что это может работать очень медленно ..
  2. Это не работает, R говорит:

    check = apply (M,MARGIN = 1, (ifelse ((M [,] <порог), 1, 0))) Ошибка в match.fun (FUN): '(ifelse ((M [,] <порог), 1, 0))'не является функцией, буквой или символом </p>

  3. Даже если я выполняю только

    ifelse ((M

для первой строки я получаю

[1,]    1    1    1    0    0

Что не соответствует действительности, поскольку в первой строке нет значений, превышающих пороговое значение. Кажется, что R просто сравнивает всю первую строку с 1-м элементом порога, затем весь 2-й ряд со вторым значением и т. Д., И это не то, что я хочу ...

Большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 23 октября 2019
apply(M, 1, function(x) max(diag(sapply(x, function(y) y >threshold))))
1 голос
/ 23 октября 2019

Вы можете попробовать,

rowSums(t(M) > threshold) >= 1
#[1] FALSE  TRUE  TRUE  TRUE  TRUE

Чтобы увидеть это построчно, просто сделайте,

t((t(M) > threshold)*1) #---> ...* 1 just converts from logical to integer

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    0    0
#[2,]    0    0    0    0    1
#[3,]    0    0    0    1    1
#[4,]    0    1    1    1    1

На основании вашего комментария,

as.integer(rowSums(t((t(M) > threshold) * 1) > 0) > 0)
#[1] 0 1 1 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...