Hello,
I'm quite new to the R programming language and it seems I might need some help with a forloop.
I aim at extracting some data out of an existing data frame so that in the end I should have a matrix with a row for each subject. At the moment, each subject is represented with several values per variable and I need to calculate the mean value per variable and subject.
This is my code so far:
dat <- data.frame(cbind(rep(c(1:3), each = 3),
matrix(runif(36, min=2, max=6),
nrow=9, ncol = 4)))
names(dat)[1:5]<-c("subject","PD50","PD100","PD150","PD200")
library(dplyr)
#>
#> Attache Paket: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
foo.mean=c() ## create empty containers
foo.total=c() ## create empty containers
all.sub = unique(dat$subject) ## create vector with all subject numbers
for(j in 1:length(all.sub)){ ## for loop over subjects
for(i in 1:4){ ## for loop over variables
a <- subset(dat, dat$subject==all.sub[[j]] , select=paste("PD", i*50, sep=""))
foo.mean<-cbind(foo.mean,colMeans(a)) ##
}
foo.total[j,]<-foo.mean[1,c((-3+4*j):4*j)] ## FINAL DATAFRAME
## one row per subject with 4 variables each
}
#> Error in foo.total[j, ] <- foo.mean[1, c((-3 + 4 * j):4 * j)]: falsche Anzahl von Indizes für Matrix
Obviously, the place holder foo.mean is getting longer and longer with each subject (it would be better to restart the object foo.mean from zero with each subject). That's why I created the - not so elegant - solution of extracting the 1:4, 5:8, etc. columns and adding each 4 columns to a new row in a dataframe. Unfortunately, this isn't working.
So, I have two questions:
- How can I create j (=number of subjects) different objects foo.mean within my loop? Each should contain the 4 average values of the previous data.
- How can I add those foo.mean-objects to the rows of a new dataframe (one row per subject)?
I already tried working with lists, the command rbind, but haven't found a solution yet. I appreciate any help! Thank you very much in advance,
Susanne