通过每行的条件(>)计算列数 [英] Count number of columns by a condition (>) for each row
问题描述
我试图找出矩阵的每一行有多少列的值大于一个指定的值。对不起,我问这个简单的问题,但我不能弄清楚。
I am trying to work out for each row of a matrix how many columns have values greater than a specified value. I am sorry that I am asking this simple question but I wasn't able to figure it out.
我已经从光栅堆栈中提取了多年的最大温度值数据看起来类似于:
I have extracted maximum temperature values from a raster stack, of multiple years of rasters, for some spatial points I am interested in. The data looks similar to:
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的年数,例如。:
I want to end up with the number of years that the temperature was above 30 for each location, eg.:
yr.above
1 0
2 0
3 2
4 3
5 3
我尝试过几件事,但没有工作并且是相当不合逻辑的(例如,尝试长度(数据[1:长度(数据),这(blah blah没有意义))或apply(数据,1,长度(数据)> 30)
I have tried a few things but they didn't work and were pretty illogical (e.g. trying length(data[1:length(data), which(blah blah doesn't make sense)), or apply(data, 1, length(data) > 30), I know these don't make sense but I am a bit stuck.
推荐答案
这将给你正在寻找的向量:
This will give you the vector you are looking for:
rowSums(data > 30)
无论 data
矩阵或数据帧。此外,它使用矢量化函数,因此是使用 apply
的一个首选方法,它比一个(慢)for循环更多。
It will work whether data
is a matrix or a data.frame. Also, it uses vectorized functions, hence is a preferred approach over using apply
which is little more than a (slow) for loop.
如果 data
是data.frame,可以通过执行以下操作将结果作为列添加:
If data
is a data.frame, you can add the result as a column by doing:
data$yr.above <- rowSums(data > 30)
或如果数据
是一个矩阵:
data <- cbind(data, yr.above = rowSums(data > 30))
也创建了一个全新的data.frame:
You can also create a whole new data.frame:
data.frame(yr.above = rowSums(data > 30))
或一个全新的矩阵:
cbind(yr.above = rowSums(data > 30))
这篇关于通过每行的条件(>)计算列数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!