2010-11-30 3 views
10

Имея эти данные:Как подсчитать, сколько элементов удовлетворяет условию в идиоматическом режиме?

> 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 ч, 1ч, 2ч, 4ч ...) Я хочу, чтобы иметь возможность построить график, сколько из эпох < = чем мин (данные) + смещение

в этом примере было бы

1 20 20 20 20 20 20 20 

Я обнаружил, как сделать это с цикл:

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

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

ответ

5

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

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

с

сумма (данные < = myoffsets [i])

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

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

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

Myres $ х < - sapply (myoffsets, функция (о) суммы (данные < = о))

+0

Это выглядит довольно хорошо. Теперь гораздо приятнее смотреть. Спасибо, что помогли новичкам! Я собрал все это вместе в кадре данных df <- data.frame (cbind (offsets = min (data) + c (0, 0.5,1,2,4,8,24,4 * 24,7) * 24) * 3600)) df $ cnt <- sapply (df $ offsets, function (o) sum (data <= o)) – user525602

0
plot(subset(data, data <= min(data+offset))) 
Смежные вопросы