[英]Count number of columns by a condition (>) for each row
我正在尝试为矩阵的每一行计算出有多少列的值大于指定值。 很抱歉我问了这个简单的问题,但我无法弄清楚。
对于我感兴趣的一些空间点,我已经从多年栅格的栅格堆栈中提取了最高温度值。数据看起来类似于:
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
我尝试了一些东西,但它们没有用,而且非常不合逻辑(例如尝试 length(data[1:length(data), which(blah blah don't sense)),或 apply(data, 1, length (数据)> 30),我知道这些没有意义,但我有点卡住了。
这将为您提供您正在寻找的向量:
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))
apply 的第三个参数需要是一个函数。 此外,您可以使用 sum 计算逻辑真值。
apply(data, 1, function(x)sum(x > 30))
我们也可以使用Reduce
和+
(假设没有 NA 元素)
Reduce(`+`, lapply(as.data.frame(data), `>`, 30))
这应该是有效的,因为我们没有转换为matrix
。
使用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()
一起使用,以便轻松执行按行聚合。
df %>%
rowwise() %>%
mutate(yr.above = sum(c_across(`1990`:`1992`) > 30)) %>%
ungroup()
注意:使用dplyr
的好处dplyr
是支持tidy selections ,它提供了一种简洁的 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.