Подтвердить что ты не робот

Количество столбцов по условию (>) для каждой строки

Я пытаюсь выработать для каждой строки матрицы, сколько столбцов имеет значения, превышающие заданное значение. Мне жаль, что я задаю этот простой вопрос, но я не смог понять это.

Я извлек максимальные значения температуры из растрового стека, из нескольких лет растров, для некоторых пространственных точек, которые меня интересуют. Данные выглядят примерно так:

data <- cbind('1990' = c(25, 22, 35, 42, 44), '1991' = c(23, 28, 33, 40, 45), '1992' = c(20, 20, 30, 41, 43))

    1990   1991   1992
1     25     23     20
2     22     28     20
3     35     33     30
4     42     40     41
5     44     45     43

Я хочу закончить с количеством лет, когда температура была выше 30 для каждого места, например:

    yr.above   
1          0
2          0
3          2
4          3
5          3

Я пробовал несколько вещей, но они не работали и были довольно нелогичными (например, длина попытки (данные [1: длина (данные), которые (бла-бла не имеют смысла)) или применяются (данные, 1, длина (данные) > 30), я знаю, что это не имеет смысла, но я немного застрял.

4b9b3361

Ответ 1

Это даст вам векторный поиск:

rowSums(data > 30)

Будет работать, будет ли data матрица или data.frame. Кроме того, он использует векторизованные функции, поэтому является предпочтительным подходом к использованию apply, который является немного более чем (медленным) для цикла.

Если data - это data.frame, вы можете добавить результат в виде столбца, выполнив:

data$yr.above <- rowSums(data > 30)

или если data является матрицей:

data <- cbind(data, yr.above = rowSums(data > 30))

Вы также можете создать целый новый data.frame:

data.frame(yr.above = rowSums(data > 30))

или целая новая матрица:

cbind(yr.above = rowSums(data > 30))

Ответ 2

Третий аргумент apply должен быть функцией. Кроме того, вы можете рассчитывать логические истины с суммой.

apply(data, 1, function(x)sum(x > 30))

Ответ 3

Мы также можем делать с Reduce и + (при условии, что нет элементов NA)

 Reduce(`+`, lapply(as.data.frame(data), `>`, 30))

Это должно быть эффективным, поскольку мы не конвертируем в matrix.