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

以下应该有效:

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]
于 2013-09-24T08:49:05.603 回答
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)

在此处输入图像描述

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
于 2013-09-24T08:50:00.740 回答