3

これは私がやろうとしている非常に単純なことです。時間が互いに近い場合は数字を追加し、そうでない場合は数字を保持したいと思います。それらがどれだけ接近しているかを示す制限時間は、手動で設定しました (ここでは 0.03 です)。これらの数値を保存して、さらに操作できるようにします。これを実行したいのですが、1.23 と 1.24 が基準に適合する場合は 1+2 を足したいのですが、1.24 と 1.25 を比較したいのですが、それらも条件を満たしているので、1+2+1 などです。 . 彼らが近くにいなくなったら、この番号を保存して先に進みます。出力ベクトルのサイズは小さくなります。これは私が望む出力です

出力 = (1 + 2 + 1 + 5、3 + 4、11 + 13、25 + 1、11、7)

出力 = (9、7、24、26、11、7)

これは私がこれまでに持っているものです:

v1 <- c(1,2,1,5,3,4,11,13, 25, 1)
t1 <- c(1.23, 1.24, 1.25, 1.28, 2.28, 2.29, 2.90, 2.91, 3.11, 3.12)

i<-1
j<-2
sums <- NULL
tot <- NULL
while (j <= length(v1))
{
  if (t1[j] - t1[i] < 0.03)
    {
    sums[i] <- v1[i] + v1[j]
    }
  if (t1[j] - t1[i] > 0.03)
  {
    tot[i] <- v1[i]
  } 
  i = i + 1
  j = j + 1
}
4

2 に答える 2

4

The following should work :

v1 <- c(1,2,1,5,3,4,11,13, 25, 1)
t1 <- c(1.23, 1.24, 1.25, 1.28, 2.28, 2.29, 2.90, 2.91, 3.11, 3.12)
threshold <- 0.02

fac <- c(1, cumsum(diff(t1) > threshold) + 1)
as.vector(tapply(v1, fac, sum))

Which gives :

# [1]  4  5  7 24 26

If you want to compute things on this output, as suggested in your comment, you should store it in a data frame. For example :

df <- data.frame(v1, t1)
df$fac <- c(1, cumsum(diff(t1) > threshold) + 1)
library(plyr)
df2 <- ddply(df, "fac", summarize, v1=sum(v1), t1=min(t1))
df2$time <- cut(df2$t1, breaks=1:4)

Which would give :

R> df2
  fac v1   t1  time
1   1  4 1.23 (1,2]
2   2  5 1.28 (1,2]
3   3  7 2.28 (2,3]
4   4 24 2.90 (2,3]
5   5 26 3.11 (3,4]
于 2013-09-24T08:49:05.603 に答える