Как подсчитать, сколько элементов удовлетворяет условию идиоматическим образом?
Имея эти данные:
> 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)))