簡體   English   中英

R循環填充矩陣

[英]R fill a matrix in a loop

我的數據是針對122天(一年中的152天到273天)和11年(1997年到2007年)的名為s1s2 ... 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM