R在循环中填充矩阵

时间:2016-07-01 12:20:27

标签: r matrix

我的数据是针对8个名为s1s2 ... s8的变量,为期122天(从152开始) 到年初的273天)和11年(从1997年到2007年)。这是数据:

#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并重复

理想情况下,我想将输出保存在以下矩阵的第3列

#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],依此类推。

谢谢。

2 个答案:

答案 0 :(得分:1)

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])和正确的年份相匹配。

答案 1 :(得分:0)

使用dplyr

library(dplyr)
dat %>% group_by(year) %>% summarise_each(funs(sum))