2016-07-01 2 views
0

данные у меня есть для 8 переменных названных s1, s2 ... s8 за 122 дней (который идет от 152 до 273 дня года) и в течение 11 лет (с 1997 по 2007). Вот данные:R заполнить матрицу в цикле

#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 году, прибавьте s1 из 122 дней

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) 

Для например, после суммирования 122 дней s1 за 1997 год сумма должна быть сохранена в 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] и так далее.

спасибо.

ответ

1

Опция dplyr из user2100721 ​​лучше, чем следующий цикла, но если вы хотите знать, как это сделать именно то, что вы заявили:

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]) и правильным годом.

0

Используйте dplyr пакет

library(dplyr) 
dat %>% group_by(year) %>% summarise_each(funs(sum)) 
Смежные вопросы