我有点新鲜,还在学习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
我尝试了几种在线方式,但我无法弄清楚为什么我的工作不起作用。我也尝试使用“新矩阵”作为“数据框架”但没有成功。
非常感谢任何人可以帮助或提出不同的方法来完成这项工作。
(如果不清楚,请告诉我。我很乐意以不同方式编辑或解释)。
谢谢!
答案 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详细讨论了这个问题。值得一读。