我正在尝试为矩阵的每一行计算出多少列的值大于指定值。对不起,我问这个简单的问题,但我无法弄明白。
对于我感兴趣的一些空间点,我已经从多年光栅的栅格堆栈中提取了最大温度值。数据类似于:
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:长度(数据),(blah blah没有意义))或者应用(数据, 1,长度(数据)> 30),我知道这些没有意义,但我有点卡住了。
答案 0 :(得分:35)
这将为您提供您正在寻找的矢量:
rowSums(data > 30)
无论data
是矩阵还是data.frame,它都能正常工作。此外,它使用向量化函数,因此是使用apply
的首选方法,它只是一个(慢)for循环。
如果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))
答案 1 :(得分:6)
apply的第三个参数需要是一个函数。此外,您可以用和来计算逻辑真值。
apply(data, 1, function(x)sum(x > 30))
答案 2 :(得分:2)
我们也可以使用Reduce
和+
(假设没有NA元素)
Reduce(`+`, lapply(as.data.frame(data), `>`, 30))
这应该是高效的,因为我们没有转换为matrix
。
答案 3 :(得分:0)
使用dplyr
软件包,您可以尝试以下两种解决方案。
library(dplyr)
df <- as.data.frame(data)
选项1
df %>%
mutate(yr.above = rowSums(select(df, `1990`:`1992`) > 30))
选项2
dplyr 1.0.0
之后,您可以将c_across()
与rowwise()
结合使用,以方便地执行 行 聚合。 / p>
df %>%
rowwise() %>%
mutate(yr.above = sum(c_across(`1990`:`1992`) > 30)) %>%
ungroup()
注意: 使用dplyr
的好处之一是 整洁选择< / strong> ,,其中提供了R的简洁方言,用于根据变量的名称或属性选择变量。
输出
# # A tibble: 5 x 4
# `1990` `1991` `1992` yr.above
# <dbl> <dbl> <dbl> <int>
# 1 25 23 20 0
# 2 22 28 20 0
# 3 35 33 30 2
# 4 42 40 41 3
# 5 44 45 43 3