[英]R fill a matrix in a loop
我的数据是针对122天(一年中的152天到273天)和11年(1997年到2007年)的名为s1
, s2
... s8
8个变量的。 数据如下:
#generate sample data
set.seed(1)
var<-as.data.frame(cbind(runif(1342),runif(1342),runif(1342),runif(1342),runif(1342),runif(1342),runif(1342),runif(1342)))
names(var)<-c("s1","s2","s3","s4","s5","s6","s7","s8")
day<-rep(152:273,times=11)
year<-rep(1997:2007,each=122)
dat<-as.data.frame(cbind(day,year,var))
我想做的是这样的:
1)选择第一个变量s1
2)对于1997年,将122天的s1
的值相加
3)一直到2007年
4)选择第二个变量s2
并重复
理想情况下,我想将输出保存在以下矩阵的第三列中
#create a matrix to store data
mat<-matrix(nrow=88,ncol=3)
var<-c("s1","s2","s3","s4","s5","s6","s7","s8")
col1<-rep(var,each=11)
col2<-rep(1997:2007,times=8)
mat[, 1:2] <- cbind(col1, col2)
例如,在将1997年的s1的122天相加后,该和应存储在mat[1,3]
。 等等。 我创建了以下循环来执行此操作
#create a loop
for (i in 3:10){
dat1<-dat[,c(1:2,i)] #selects the s1 data
for (j in 1997:2007){
year<-dat1[dat1$year==j,] # selects the data of 1997 from s1
total<-sum(year[,3]) #sums up the 122 days of s1 for the year 1997
mat<-total?????????????????
}}
现在我被困在最后一部分。 如何将total
分配给mat[1,3]
,将下一个总计分配给mat[1,4]
,依此类推。
谢谢。
user2100721的dplyr选项比以下循环更好,但是如果您想知道如何准确地执行您所声明的内容:
for (i in 3:10){
dat1<-dat[,c(1:2,i)] #selects the s1 data
for (j in 1997:2007){
year <- dat1[dat1$year==j,] # selects the data of 1997 from s1
total <- sum(year[,3]) #sums up the 122 days of s1 for the year 1997
mat[mat[,1] == names(dat)[i] & mat[, 2] == j, 3] <- total
}}
基本上,您可以根据需要分配给矩阵的特定单元格。 我在这里通过将行与正确的列(names(dat)[i])
和正确的年份进行匹配来选择行。
使用dplyr
包
library(dplyr)
dat %>% group_by(year) %>% summarise_each(funs(sum))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.