按每行的条件(>)计算列数

时间:2013-09-18 00:43:46

标签: r count col

我正在尝试为矩阵的每一行计算出多少列的值大于指定值。对不起,我问这个简单的问题,但我无法弄明白。

对于我感兴趣的一些空间点,我已经从多年光栅的栅格堆栈中提取了最大温度值。数据类似于:

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),我知道这些没有意义,但我有点卡住了。

4 个答案:

答案 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