![](/img/trans.png)
[英]R - update t1 with count of t2 rows where two columns are the same as for t1
[英]How to sum the variables according to the times it falls into t1[i] < t[j] < t2[i]
這是R的另一個版本-如何在另一列的條件所定義的間隔之間求和一列中的對象
我有3個時間變量t1,t2和t3,以及帶有數字的相應列。 我想對“數字”中的變量求和,這些變量將落在t1[i]
和t2[i]
。 例如:
t1 <- c(1.12, 2.16, 3.18, 4.56, 8.90, 29.36, 30.30, 31.30, 36.90, 50.01)
t2 <- c(2.14, 2.77, 3.65, 4.78, 8.99, 30.01, 31.07, 31.89, 40.30, 55.08)
t3 <- c(1.16, 1.55, 1.35, 2.17, 2.18, 2.19, 2.34, 3.30, 4.59, 8.91, 29.99, 30.32, 30.98, 31.32, 37.00, 52.00, 54.00)
numbers <- c(7,1,2,5,5,6,9,12, 13, 22, 7, 1, 7, 11, 21, 29)
輸出,我正在尋找這樣的輸出:在這里,我在t3中有前三個數字滿足我的critera,依此類推,將它們相加並存儲在新的向量“輸出”中。 請注意,這里的“輸出”是我自己編寫的,而不是經過計算的(如示例所示)。 我可以計算出第一組,但是我的i值保持不變,因此我無法繼續下去...希望您能對我有所幫助,謝謝您的寶貴時間。
output = (7+1+2,5+5+6+9,12,13,22,7,1,7,11,21+29)
output = (10, 25, 12, 13, 22, 7, 1, 7, 11, 50)
到目前為止,這是我所擁有的:
t1 <- c(1.12, 2.16, 3.18, 4.56, 8.90, 29.36, 30.30, 31.30, 36.90, 50.01)
t2 <- c(2.14, 2.77, 3.65, 4.78, 8.99, 30.01, 31.07, 31.89, 40.30, 55.08)
t3 <- c(1.16, 1.55, 1.35, 2.17, 2.18, 2.19, 2.34, 3.30, 4.59, 8.91, 29.99, 30.32, 30.98, 31.32, 37.00, 52.00, 54.00)
numbers <- c(7,1,2,5,5,6,9,12, 13, 22, 7, 1, 7, 11, 21, 29)
i = 1
j = 1
k = 1
N = NULL
Sums = NULL
while (j < length(t1))
{
while (i < length(t3))
{
if (t3[i] > t1[j] & t3[i] <= t2[j])
{
N[i] <- numbers[i]
}
i = i + 1
}
Sums[k] = sum(N)
k = k + 1
j = j + 1
}
除非我誤解你拍攝什么,沒有必要對所有的while
S和if
秒。
首先,整理您的數據,即:
dat <- data.frame(time=t3[1:16], obs=numbers)
然后使用cut
將數據切成一定的間隔,然后用tapply
將這些數據相加,如下所示:
all <- tapply(dat$obs, cut(dat$time, breaks=sort(c(t1, t2))), FUN=sum)
# omit the gaps between intervals
all[seq(1,length(all),by=2)]
(1.12,2.14] (2.16,2.77] (3.18,3.65] (4.56,4.78] (8.9,8.99] (29.4,30] (30.3,31.1] (31.3,31.9] (36.9,40.3] (50,55.1]
10 25 12 13 22 7 8 11 21 29
k
和j
在循環中是相同的,並且內部循環可以用向量化版本替換:
t3 <- head(t3,-1) # editing the error the OP left in place
nint <- length(t1)
N <- vector('list',nint)
Sums <- vector('integer',nint)
for (i in 1:nint){
N[[i]] <- numbers[which(findInterval(t3,c(t1[i],t2[i]))==1)]
Sums[i] <- sum(N[[i]])
}
注釋1.得出與@bmoore相同的結果,數字存儲在N中,然后加到Sums中。 我想,您需要將N
列為要做您打算做的事情的清單,而這一行
N[i] <- numbers[i]
正在覆蓋單個值,而不是像@holgrich使用c(N,numbers[i])
一樣將其添加到向量中。
注釋2.當t3
等於t1[i]
或t2[i]
, findInterval
可能會發生意外的事情,因此您可以改用which(t3 > t1[i] & t3 < t2[i])
明確聲明不等式。
注釋3.在@bmoore的答案中,完全沒有循環是R中更標准的事情。
您必須在運行循環時重置i
和N
t1 <- c(1.12, 2.16, 3.18, 4.56, 8.90, 29.36, 30.30, 31.30, 36.90, 50.01)
t2 <- c(2.14, 2.77, 3.65, 4.78, 8.99, 30.01, 31.07, 31.89, 40.30, 55.08)
t3 <- c(1.16, 1.55, 1.35, 2.17, 2.18, 2.19, 2.34, 3.30, 4.59, 8.91, 29.99, 30.32, 30.98, 31.32, 37.00, 52.00, 54.00)
numbers <- c(7,1,2,5,5,6,9,12, 13, 22, 7, 1, 7, 11, 21, 29)
i = 1
j = 1
k = 1
N = c()
Sums = NULL
while (j < length(t1)){
while (i < length(t3)){
if (t3[i] > t1[j] & t3[i] <= t2[j]) N <- c( N, numbers[i] )
i = i + 1
}
i = 1
Sums[k] = sum(N)
N = c()
k = k + 1
j = j + 1
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.