[R] Forloop/ifelse program problem and list of dataframes
Ivan Calandra
ivan.calandra at u-bourgogne.fr
Wed Mar 21 17:28:41 CET 2012
Hi Ian,
I haven't read in details because you don't provide a reproducible
example (see ?dput) but you might want to take a look at the aggregate()
and doBy::summaryBy() functions.
HTH,
Ivan
--
Ivan CALANDRA
Université de Bourgogne
UMR CNRS/uB 6282 Biogéosciences
6 Boulevard Gabriel
21000 Dijon, FRANCE
+33(0)3.80.39.63.06
ivan.calandra at u-bourgogne.fr
http://biogeosciences.u-bourgogne.fr/calandra
Le 21/03/12 16:44, Ian Craig a écrit :
> Hello R Community,
>
> I don't post to these things often so excuse me if I stumble on my forum
> etiquette. This is a complex problem for me, which may require two forum
> entries, but I will try my best to be concise. Also, I am a self taught
> coder, so if my code is not to convention, your constructive criticism is
> always welcome.
>
> I need to split up a data frame by participant (gpsarc - factor), status
> (testpo - factor), and by date (LocalDate), then sum the distance
> (Dist_Bef_m - numeric) records for each date and average them across each
> status state for each participant. Each participant has several records
> for each date and for at least 1 of 3 different possible status types (max
> 3). In the end, I want a table with participant number and the status
> state as my column headings with means for each status state under their
> appropriate heading (see example below). I am confident I made this way
> more complicated than it needs to be. I really appreciate any help you can
> offer.
>
> Here is my relevant coding so far:
>
> s1<- split(data[,c(4,10,20,42)], data$gpsarc)
> for(i in 1:length(s1))
> s1[[i]]<- split(s1[[i]],s1[[i]]$testpo)
> s2<- vector("list", length(s1))
> for(i in 1:length(s2))
> s2[[i]]<- ldply(s1[[i]],
> function(x)
> {
> if(nrow(x) == 0) #### if one status state does not exist, but still
> accounted in the split sublist because its a factor, I would get an error,
> so I added this If/Else portion to remove those entries with no records
> {
> remove(x)
> }
> else
> {
> by(x, x[["LocalDate"]],
> function(x1)
> {
> sum(x1[["Dist_Bef_m"]])
> })
> }
> })
>
> s3<- vector("list", length(s2))
> for(i in 1:length(s3))
> s3[[i]]<- data.frame(mean = apply(s2[[i]][,-1],1,mean,na.rm=TRUE),
> row.names = as.character(s2[[i]][,1]))
>
> here is a sample of the s3 result:
>
> [[1]]
> mean
> 2 12533.2
>
> [[2]]
> mean
> 2 26300.96
> 3 25313.93
>
> [[3]]
> mean
> 1 48489.15
> 3 27398.23
>
> [[4]]
> mean
> 1 34783.97
>
> [[5]]
> mean
> 1 21293.19
> 2 21962.41
> 3 18272.67
>
> ##### I really want it to look like this:
>
> ppt 1 2 3
> 1 NA 12533.2 NA
> 2 NA 26300.96 25313.93
> 3 48489.15 NA 27398.23
> 4 34783.97 NA NA
> 5 21293.19 21962.41 18272.67
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
>
More information about the R-help
mailing list