Frage

Suppose I have the following vector.

test <- c(0.3,1.0,0.8,0.3,0.6,0.4,0.3,0.5,0.6,0.4,0.5,0.6,0.1,0.6,0.2,0.7,0.0,0.7,0.3,0.3,0.4,0.9,0.9,0.9,0.3,0.6,0.3,0.1)

Is there a way to get non logical frequency table such as?

Frequency between 0 and 0.1

Frequency between 0.2 and 0.4

Frequency between 0.5 and 0.8

Frequency between 0.9 and 1

Thanks

War es hilfreich?

Lösung

There are a few extra unnecessary groups in here but you can ignore those or subset them

table(cut(test, breaks = c(0,0.1,0.2,0.4,0.5,0.8,0.9,1)))

Andere Tipps

I'm not aware of a dedicated function, but you could write your own:

test <- c(0.3,1.0,0.8,0.3,0.6,0.4,0.3,0.5,0.6,0.4,0.5,0.6,0.1,0.6,0.2,0.7,0.0,0.7,0.3,0.3,0.4,0.9,0.9,0.9,0.3,0.6,0.3,0.1)
mapply(function (start, end) { sum(test >= start & test <= end) },
       c(0, 0.2, 0.5, 0.9), # starts
       c(0.1, 0.4, 0.8, 1)) # ends
# [1]  3 11 10 4

The use of mapply is purely to vectorise over the starts and ends which you supply. Note test is hard-coded into this function and the endpoints are inclusive, so adjust as necessary, etc.

Something like this maybe:

labs <- c("0 and 0.1", "0.2 and 0.4", "0.5 and 0.8", "0.9 and 1")
table(cut(test, c(0,  .2, .5, .9, 1.1), right = FALSE, labels = labs))

##   0 and 0.1 0.2 and 0.4 0.5 and 0.8   0.9 and 1 
##           3          11          10           4 

Assuming that you really want to bin these as tenths, and there are no missing intervals, findInterval is made for the task.

Here, 1.0 is in a group by itself:

table(findInterval(test, c(0,.2, .5, .9, 1)))

##  1  2  3  4  5 
##  3 11 10  3  1 

With this statement, 1.0 is in the last interval, with .9:

table(findInterval(test, c(0,.2, .5, .9, 1), rightmost.closed=T))

##  1  2  3  4 
##  3 11 10  4 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top