Как подсчитать, сколько элементов удовлетворяет условию идиоматическим образом?

Имея эти данные:

> data
 [1] 1290603356 1290603360 1290603350 1290603344 1290603340 1290603373
 [7] 1290603354 1290603359 1290603345 1290603363 1290603357 1290603354
[13] 1290603364 1290603349 1290603352 1290603365 1290603349 1290603343
[19] 1290603339 1290603343
> offsets <- c(0, 0.5,1,2,4,8,24,4*24,7*24) * 3600)
[1]   1800   3600   7200  14400  28800  86400 345600 604800
> myoffsets <- min(data)+offsets

список эпох UNIX и список смещений (0.5 часа, 1h, 2h, 4h...) Я хочу уметь отображать, сколько из этих эпох <= чем min (data) + offset

В этом примере это будет

1 20 20 20 20 20 20 20

Я нашел, как это сделать с циклом for:

for(i in c(1:length(myoffsets))) myres$x[i] <- length(data[data <= myoffsets[i]])

Но я уверен, что есть более идиоматический способ, если вы делаете это, не так запутанно?

Ответ 1

Предложение 1: Немного более идиоматичным способом было бы заменить

длина (данные [данные <= myoffsets [i]])

с

sum (данные <= myoffsets [i])

Таким образом, вы не получаете подмножество data для каждого значения в myoffsets, а только для вычисления его длины и удаления.

Предложение 2: c() в for избыточно. Следующее будет делать то же самое с меньшим количеством нажатий клавиш: for(i in 1:length(myoffsets)).

Наконец,, если вы предпочитаете избавиться от явного цикла, что-то вроде этого может быть на ваш вкус:

myres $x < - sapply (myoffsets, function (o) sum (data <= o))

Ответ 2

plot(subset(data, data <= min(data+offset)))