下标超出界限R.

时间:2017-08-26 15:39:26

标签: r matrix

我有点新鲜,还在学习R.到目前为止,我所研究过的几篇文章并没有给你带来太多帮助。

因此,我的结果'数据框df.results如下所示:

         | Age  | Flock | Year | Heating  | Cooling
------------------------------------------------------
1        |  1   |  1    | 2010 | 266.5788 |    0
2        |  1   |  1    | 2010 | 275.4562 |    0
3        |  1   |  1    | 2010 | 285.1423 |    0
...
200000   |  15  |  28   | 2020 |-39.84244 |  275.8492
...
400000   |  35  |  45   | 2030 |-41.09734 |  284.5375
...             
900000   |  12  |  300  | 2040 |-42.22414 |  292.3389 
...
150000   |  22  |  181  | 2050 | 28.9140  |    0
...
250000   |  34  |  322  | 2070 | -38.5952 |  430.8928
...

因此,Flock范围从1到322. Year从2010年到2090年以10为单位(仅有9个不同的值)。

我的目标是创建包含322行(flocks)和9列(year)的矩阵,每年每个鸡群的总和为Heating(第一个矩阵)和Cooling(第二个矩阵)。

我试过这段代码:

list.years <- seq(2010, 2090, 10)
nyears <- length(list.years)
f <- 322

sum.heat <- matrix(0, f, length(nyears))
sum.cool <- matrix(0, f, length(nyears))


for(j in 1:nyears){
    for(i in 1:f){
       sum.heat[i,j] <- sum(df.results$Heating[df.results$Flock == i], na.rm = TRUE)
       sum.cool[i,j] <- sum(df.results$Cooling[df.results$Flock == i], na.rm = TRUE)
}}

出于某种原因,这不起作用:

Error in `[<-`(`*tmp*`, i, j, value = sum(df.results$Ventilation[df.results$Flock ==  : subscript out of bounds

我尝试了几种在线方式,但我无法弄清楚为什么我的工作不起作用。我也尝试使用“新矩阵”作为“数据框架”但没有成功。

非常感谢任何人可以帮助或提出不同的方法来完成这项工作。

(如果不清楚,请告诉我。我很乐意以不同方式编辑或解释)。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用dcast()包中的data.table函数而不是double for循环来实现此功能。

# data sample with 2 flocks, 3 years, & 2 entries per year per flock
set.seed(222)
df.sample <- data.frame(Flock = c(rep(1, 6), rep(2, 6)),
                        Year = rep(c(2010, 2020, 2030), 4),
                        Heating = rnorm(12, sd = 50),
                        Cooling = rnorm(12, mean = 100, sd = 30))

> df.sample
   Flock Year      Heating   Cooling
1      1 2010  74.38785448  79.22177
2      1 2020  -0.09459503 118.07947
3      1 2030  69.05103950  94.06741
4      1 2010 -19.01068157  64.42376
5      1 2020   9.20681152  39.83461
6      1 2030 -12.34479415 100.22530
7      2 2010 -60.77804548 115.58471
8      2 2020  78.07025492  77.61114
9      2 2030  21.36550986 121.79364
10     2 2010 -60.05117532 121.40970
11     2 2020  52.62292475  80.49811
12     2 2030 -65.25317830 144.96089

library(data.table)

dcast(dt.sample, Flock~Year, fun = sum, value.var = "Heating")

  Flock       2010       2020      2030
1     1   55.37717   9.112216  56.70625
2     2 -120.82922 130.693180 -43.88767

dcast(dt.sample, Flock~Year, fun = sum, value.var = "Cooling")

  Flock     2010     2020     2030
1     1 143.6455 157.9141 194.2927
2     2 236.9944 158.1092 266.7545

P.S。通常,在R中使用for循环是一个坏主意。 Patrick Burns的第3圈&#39; The R Inferno详细讨论了这个问题。值得一读。