是否可以使用范围在R中创建类似countif的函数?

时间:2018-08-03 18:16:11

标签: r database count

我已经阅读了有关对R中的条目进行计数的方法的问题:

how to realize countifs function (excel) in R

我正在寻找一种类似的方法,只是我想对给定范围内的数据进行计数。

例如,假设我有此数据集:

data <- data.frame( values = c(1,1.2,1.5,1.7,1.7,2))

按照链接问题的方法,我们将开发如下内容:

count <- data$values == 1.5
sum(count)

问题是,我希望能够在计数中包括0.2到1.5之间的任何值-也就是说,所有可能的数字从1.3到1.7。

有办法吗?

3 个答案:

答案 0 :(得分:4)

sum(data$values>=1.3 & data$values<=1.7)

正如您链接到的问题中的解释所指出的那样,当您只写一个布尔条件时,它会生成一个TRUE和FALSE的向量,其长度与原始数据帧的长度相同。 TRUE等于1,FALSE等于0,因此将其相加即可得到一个计数。因此,这仅仅是将您的条件作为布尔短语的问题。如果存在多个条件,则将它们与&|(或)连接-与在excel中可以执行的方式几乎相同(仅在excel中,您必须执行AND()或OR())。

(对于更通用的解决方案,您可以使用dplyr::between-由于它是用C ++实现的,因此应该更快一些。在这种情况下,它应该是sum(between(data$values,1.3,1.7)。)

答案 1 :(得分:1)

就像@doviod一样,您可以使用复合逻辑条件。
我的方法不同,我编写了一个函数,该函数采用矢量并将中心点value和距离delta作为范围。

在@doviod的建议之后,我设置了默认值delta = 0,因此,如果仅传递value,则函数返回

  

值等于用户提供的值的情况的计数。
  (doviod,在评论中)

countif <- function(x, value, delta = 0) 
  sum(value - delta <= x & x <= value + delta)

data <- data.frame( values = c(1,1.2,1.5,1.7,1.7,2))

countif(data$values, 1.5, 0.2)
#[1] 3

答案 2 :(得分:1)

which标识向量中满足条件的所有值的位置,然后length计数“命中”。

length( which(data$values>=1.3 & data$values<=1.7) )
[1] 3