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

R 按条件(>;)计算每行的列数,r,count,col,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

我试图计算出矩阵中每一行有多少列的值大于指定值。很抱歉,我问了这个简单的问题,但我没能弄明白

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

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

我尝试了一些方法,但都不起作用,而且非常不合逻辑(例如,尝试长度(数据[1:length(数据),这(废话)毫无意义)),或者应用(数据,1,length(数据)>30),我知道这些没有意义,但我有点卡住了。

应用程序的第三个参数需要是一个函数。此外,您可以使用sum来计算逻辑实数

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

这将为您提供要查找的向量:

rowSums(data > 30)
无论
data
是矩阵还是data.frame,它都会起作用。此外,它使用矢量化函数,因此是优于使用
apply
的首选方法,后者只不过是一个(缓慢的)for循环

如果
data
是data.frame,则可以通过执行以下操作将结果添加为列:

data$yr.above <- rowSums(data > 30)
您还可以创建一个全新的data.frame:

data.frame(yr.above = rowSums(data > 30))
或者一个全新的矩阵:

cbind(yr.above = rowSums(data > 30))

我们还可以使用
Reduce
+
(假设没有NA元素)


这应该是有效的,因为我们没有使用
dplyr
包转换为
matrix
,您可以尝试以下两种解决方案

library(dplyr)
df <- as.data.frame(data)
选项2

dplyr 1.0.0
之后,您可以使用
c_cross()
rowwise()
来轻松执行行聚合

df %>%
  rowwise() %>%
  mutate(yr.above = sum(c_across(`1990`:`1992`) > 30)) %>%
  ungroup()
注意:使用
dplyr
的好处之一是支持整洁的选择,它提供了一种简洁的R方言,用于根据变量的名称或属性选择变量


输出

##一个tible:5x4
#1990 ``1991 ``1992 `年以上
#            
# 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

+1,但请注意,op示例中的
数据
是一个
矩阵
而不是
数据。框架
谢谢。很难说:
cbind
确实给出了一个矩阵,但问题中的打印数据暗示了一个
数据。框架
。我编辑了这两种可能性。太好了!谢谢弗洛德尔。我故意没有这样做看看行和,因为我认为它会给我一个大于30的所有值的总和。事实上,我一直在使用行和来获得不同变量的行和值…生活和学习。谢谢你非常欢迎。这个想法是
data>30
返回一个真和假矩阵。当你应用
行和时trix、TRUE和FALSE分别转换为1和0。此外,
应用(数据>30,1,总和)
 Reduce(`+`, lapply(as.data.frame(data), `>`, 30))
library(dplyr)
df <- as.data.frame(data)
df %>%
  mutate(yr.above = rowSums(select(df, `1990`:`1992`) > 30))
df %>%
  rowwise() %>%
  mutate(yr.above = sum(c_across(`1990`:`1992`) > 30)) %>%
  ungroup()
# # 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