簡體   English   中英

如何根據變量落入t1 [i] <t [j] <t2 [i]的時間求和

[英]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 

kj在循環中是相同的,並且內部循環可以用向量化版本替換:

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中更標准的事情。

您必須在運行循環時重置iN

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM