2013-09-18 3 views
25

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

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

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), я знаю, что это не имеет смысла, но я немного застрял.

ответ

30

Это даст вам вектор, который вы ищете:

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)) 
+0

+1, хотя обратите внимание, что 'data' в примере op является' matrix', а не 'data.frame' – thelatemail

+0

Спасибо. Трудно сказать: 'cbind' действительно дает матрицу, но печатные данные в вопросе предлагают« data.frame ». Я отредактировал для решения обеих возможностей. – flodel

+0

Отлично! Спасибо, фланель. Я целенаправленно не смотрел на rowSums, потому что думал, что это даст мне сумму всех значений выше 30. Фактически я использую rowSums для получения суммированного значения моих строк для другой переменной ... Live и learn. Cheers – Adam

6

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

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

Кроме того, 'apply (data> 30,1, sum)'! – Frank

2

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

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

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