R中的嵌套循环以计算平均天数

乔治·提斯尼(Giorgy Tisni)

我正在解决一个问题。尝试在R中重现公式。我刚刚在Mathematica中完成了此代码,但是现在我想为我的学生在R中重现。这是一种计算一年中“平均日”(称为代表日)的聪明方法。描述这种方法在这里

我的部分数据是:

date    temp    Hour    DayCount
01/01/17    -2  0   1
01/01/17    -2  1   1
01/01/17    -2  2   1
01/01/17    -3  3   1
01/01/17    -4  4   1
01/01/17    -4  5   1
01/01/17    -5  6   1
01/01/17    -6  7   1
01/01/17    -4  8   1
01/01/17    -2  9   1
01/01/17    -1  10  1
01/01/17    0   11  1
01/01/17    1   12  1
01/01/17    2   13  1
01/01/17    1   14  1
01/01/17    -1  15  1
01/01/17    -2  16  1
01/01/17    -1  17  1
01/01/17    -2  18  1
01/01/17    -3  19  1
01/01/17    -2  20  1
01/01/17    -3  21  1
01/01/17    -2  22  1
01/01/17    -1  23  1
02/01/17    -1  0   2
02/01/17    -1  1   2
02/01/17    -1  2   2
02/01/17    -1  3   2
02/01/17    -1  4   2
02/01/17    -1  5   2
02/01/17    -1  6   2
02/01/17    -1  7   2
02/01/17    -1  8   2
02/01/17    -1  9   2
02/01/17    0   10  2
02/01/17    0   11  2
02/01/17    1   12  2
02/01/17    1   13  2
02/01/17    1   14  2
02/01/17    1   15  2
02/01/17    1   16  2
02/01/17    1   17  2
02/01/17    -1  18  2
02/01/17    -3  19  2
02/01/17    -2  20  2
02/01/17    -2  21  2
02/01/17    -2  22  2
02/01/17    -1  23  2

所以我想重现这个公式: 公式1

其中,N是时间段中的天数(现在为2),每一ckickj是第k天的第i天的温度。我所拥有的是对角线全为零的对称矩阵。然后我必须汇总所有行公式2

这是我的代码:

 data$DayCount <- as.factor(data$DayCount)
 datasplit <- split(data, data$DayCount) #Split my data for each day
 distance=matrix() #Create an empty matrix

 for (k in 1:24) {
 for (i in 1:2) {
   for (j in 1:2) {


distance[i,j]= ((datasplit[[i]][k,2]-datasplit[[j]][k,2])^2)
sum=sum(distance)
            }
   }
 }

有什么建议么?我知道您有能力做到。请帮助我!

甘薯

首先,我们创建一个数据框对象,以便我们可以轻松地操作数据:

df <- read.csv(stringsAsFactors = TRUE, text = 'date, temp, Hour, DayCount
01/01/17, -2, 0 , 1
01/01/17, -2, 1 , 1
01/01/17, -2, 2 , 1
01/01/17, -3, 3 , 1
01/01/17, -4, 4 , 1
01/01/17, -4, 5 , 1
01/01/17, -5, 6 , 1
01/01/17, -6, 7 , 1
01/01/17, -4, 8 , 1
01/01/17, -2, 9 , 1
01/01/17, -1, 10, 1
01/01/17, 0 , 11, 1
01/01/17, 1 , 12, 1
01/01/17, 2 , 13, 1
01/01/17, 1 , 14, 1
01/01/17, -1, 15, 1
01/01/17, -2, 16, 1
01/01/17, -1, 17, 1
01/01/17, -2, 18, 1
01/01/17, -3, 19, 1
01/01/17, -2, 20, 1
01/01/17, -3, 21, 1
01/01/17, -2, 22, 1
01/01/17, -1, 23, 1
02/01/17, -1, 0 , 2
02/01/17, -1, 1 , 2
02/01/17, -1, 2 , 2
02/01/17, -1, 3 , 2
02/01/17, -1, 4 , 2
02/01/17, -1, 5 , 2
02/01/17, -1, 6 , 2
02/01/17, -1, 7 , 2
02/01/17, -1, 8 , 2
02/01/17, -1, 9 , 2
02/01/17, 0 , 10, 2
02/01/17, 0 , 11, 2
02/01/17, 1 , 12, 2
02/01/17, 1 , 13, 2
02/01/17, 1 , 14, 2
02/01/17, 1 , 15, 2
02/01/17, 1 , 16, 2
02/01/17, 1 , 17, 2
02/01/17, -1, 18, 2
02/01/17, -3, 19, 2
02/01/17, -2, 20, 2
02/01/17, -2, 21, 2
02/01/17, -2, 22, 2
02/01/17, -1, 23, 2')

现在,让我们尝试按照您的指示进行操作,我并不是试图以最佳方式实现这一目标,而是尝试尽可能地坚持您的原始想法,因此,我将使用几个嵌套循环:

# get the different days
days <- levels(df$date)
# create the A matrix, empty
A <- matrix(nrow = length(days), ncol = length(days))
# iterate
for(i in 1:length(days)) {
  for(j in 1:length(days)) {
    # get all the temperatures available for each day
    ci <- df[df$date == days[i],]$temp
    cj <- df[df$date == days[j],]$temp
    # update the A matrix
    A[i, j] <- sum((ci - cj)^2)
  }
}
# finally the last sum
Aj <- unlist(lapply(1:length(days), function(i) sum(A[i, ])))

结果是:

> A
     [,1] [,2]
[1,]    0   97
[2,]   97    0

> Aj
[1] 97 97

这应该可以工作任意天数,并且可以每天进行任意多次温度测量(不一定是24天)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章