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