如何仅在它们之间的时间间隔非常小的情况下按顺序总结数字

时间:2013-09-24 07:59:27

标签: r

这是我想要做的非常简单的事情:如果他们的时间彼此接近,我想添加数字,如果不是,我想保留数字。时间限制决定了它们在一起的距离我手动设置(这里是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
}

2 个答案:

答案 0 :(得分:4)

以下内容应该有效:

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))

给出了:

# [1]  4  5  7 24 26

如果您想根据评论中的建议计算此输出的内容,则应将其存储在数据框中。例如:

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)

哪会给:

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]

答案 1 :(得分:3)

我建议使用群集:

#Cluster according to distance
hr <- hclust(dist(t1))

#plot a dendrogram
plot(hr)

# cut at desired distance
hc <- cutree(hr, h=0.02)

#highlight in dendrogram
rect.hclust(hr, h=0.02)

enter image description here

aggregate(v1, list(hc), sum)
#   Group.1  x
# 1       1  3
# 2       2  1
# 3       3  5
# 4       4  7
# 5       5 24
# 6       6 26

请注意,这并不能完全给出您问题中概述的递归方法的结果,但这种方式似乎更为明智。您可以使用不同的截止值来控制聚类。

#Use 0.03 for cutoff instead:
aggregate(v1, list(cutree(hr, h=0.03)), sum)
#   Group.1  x
# 1       1  4
# 2       2  5
# 3       3  7
# 4       4 24
# 5       5 26