Количество столбцов по условию (>) для каждой строки
Я пытаюсь выработать для каждой строки матрицы, сколько столбцов имеет значения, превышающие заданное значение. Мне жаль, что я задаю этот простой вопрос, но я не смог понять это.
Я извлек максимальные значения температуры из растрового стека, из нескольких лет растров, для некоторых пространственных точек, которые меня интересуют. Данные выглядят примерно так:
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), я знаю, что это не имеет смысла, но я немного застрял.
Ответы
Ответ 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
.