Выведите индекс строки первого элемента каждого столбца в матрице, чтобы удовлетворить логическое условие - PullRequest
0 голосов
/ 04 октября 2018

У меня есть большая матрица (8000 x 8000), содержащая числовые данные.Я хотел бы, чтобы выходная матрица с единственной строкой, содержащей индекс строки первого элемента в каждом столбце, удовлетворяла логическому оператору.Обратите внимание, что не во всех столбцах будет элемент, удовлетворяющий условию.

Пример ввода:

    Column
Row   1         2          3          4          
 1  34.349    23.642     64.321     12.320      
 2  74.734    11.755     29.424     55.432     
 3  31.345    99.328     64.236     45.453     
 4  22.436    84.345     45.323     21.008     
 5  7.323    101.324     45.254     32.233      
 6  119.345  23.324      72.474     53.543

Логический оператор: x> 70 дает пример вывода:

    Column
Row   1         2          3          4
 1    2         3          6          NA

Я новичок в R и изо всех сил пытался получить этот вывод, используя стандартное совпадение и какие функции.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 04 октября 2018

Поскольку это матрица, которую мы можем использовать apply с margin = 2 (по столбцам).Здесь мы проверяем, имеет ли столбец хотя бы одно значение больше 70, и возвращаем его индекс, иначе возвращаем NA.

apply(mat > 70, 2, function(x) if (any(x)) which.max(x) else NA)

#V1 V2 V3 V4 
# 2  3  6 NA 

В идеале apply(mat > 70, 2, which.max) дал бы вам то, что вам нужно, но он потерпел неудачу, когда у вас естьследовательно, нет элемента больше 70, проверка с условиями if и any.

Это также будет работать с фреймом данных.


Если элементов больше 70, а столбец имеет значения NA, возвращается ошибка.

mat[1, 4] <- NA
apply(mat > 70, 2, function(x) if (any(x)) which.max(x) else NA)

Ошибка в if (any (x)) which.max (x) else NA: пропущенное значение там, где требуется TRUE / FALSE

В этом случаемы можем использовать na.rm аргумент в any, чтобы избежать этой ошибки.

apply(mat > 70, 2, function(x) if (any(x, na.rm = TRUE)) which.max(x) else NA)

#V1 V2 V3 V4 
# 2  3  6 NA 
...