我已经阅读了有关对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。
有办法吗?
答案 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