[R] iterating over groups of columns

Jannis bt_jannis at yahoo.de
Wed Jun 9 11:29:11 CEST 2010


Seems to get complicated ;-)....

As always, i expect more sophisticted solutions  than mine to exist, but I would try the following:

If II understood you correct you want to compute the means of all the k.1.x, then k.2.x ....., correct?

I would do it this way

col.index <- sub('[.].*$','',sub('^.?[.]','',colnames(the.data)))

min.values=numeric(length=10)
for (i in 1:10)
   min[i]<-min(the.data[,col.index==i])


Perhaps you have to adapt the code slightly as I did not test it. 


HTH
Jannis



col.index <- unlist(strsplit(colnames(the.data),'\\.'))[2]

--- 09wkj <Bill.K.Jannen at williams.edu> schrieb am Di, 8.6.2010:

> Von: 09wkj <Bill.K.Jannen at williams.edu>
> Betreff: Re: [R] iterating over groups of columns
> An: r-help at r-project.org
> CC: "Jannis" <bt_jannis at yahoo.de>
> Datum: Dienstag, 8. Juni, 2010 22:32 Uhr
> In the code fragment, I used 'by' to
> actually compute the min value (part of the statement with
> the eval) - and I agree that an apply would work there
> wonderfully. 
> 
> However, my hope was to use an apply for the subsetting of
> the data.frame's columns, so that I could then use an apply
> to compute the min across each row of the subsets.
> 
> Something that would give me the results of the following,
> but programmatically:
> apply(the.data[,1], 1, min)        #min
> of the first column
> apply(the.data[,2:3], 1, min)    #min of the next
> 2 columns
> apply(the.data[,4:6], 1, min)    #min of the next
> 3 columns
> apply(the.data[,7:10], 1, min)  #min of the next 4
> columns
> ...
> apply(the.data[,46:55], 1, min)#min of the next 10 columns
> 
> 
> 
> Like, can I make a vector of levels with 'rep(1:10,1:10)',
> and then apply the function across all columns in each
> level? And then how could I cbind them together?
> 
> 
> Thanks for any help,
> Bill
> 
> 
> 
> 
> On Jun 8, 2010, at 5:08 PM, Jannis wrote:
> 
> > you should have found a solution for that in the help
> page of apply.
> > 
> > just run
> > 
> > min.values = apply(the.data,1,min)
> > 
> > the '1' marks the direction (e.g. whether apply is
> applied to rows or columns), it could be a 2 as well. Check
> that yourself in the apply documentation.
> > 
> > Then run rbind(the.data,min.values) (could be cbind as
> well, I am not sure again ;-) ) and you get what you want.
> > 
> > 09wkj schrieb:
> >> I am mainly a Java/C++ programmer, so my mind is
> used to iterating over data with for loops. After a long
> break, I am trying to get back into the "R mindset", but I
> could not find a solution in the documentation for the
> applys, aggregate, or by.
> >> 
> >> I have a data.frame where each row is an entry
> with 10 groups of measurements. The first measurement spans
> 1 column, the second spans 2 columns, third 3, and so on (55
> total columns). What I want to do is add to my data.frame 10
> new columns containing the minimum value of each
> measurement.
> >> 
> >> dim(the.data)
> >> [1] 1679  55
> >> 
> >>  
> >>> colnames(the.data)
> >>>    
> >>  [1]
> "k.1.1"   "k.2.1"   "k.2.2"   "k.3.1"   "k.3.2"   "k.3.3"   "k.4.1" 
>   [8]
> "k.4.2"   "k.4.3"   "k.4.4"   "k.5.1"   "k.5.2"   "k.5.3"   "k.5.4"   [15]
> "k.5.5"   "k.6.1"   "k.6.2"   "k.6.3"   "k.6.4"   "k.6.5"   "k.6.6"   [22]
> "k.7.1"   "k.7.2"   "k.7.3"   "k.7.4"   "k.7.5"   "k.7.6"   "k.7.7"   [29]
> "k.8.1"   "k.8.2"   "k.8.3"   "k.8.4"   "k.8.5"   "k.8.6"   "k.8.7"   [36]
> "k.8.8"   "k.9.1"   "k.9.2"   "k.9.3"   "k.9.4"   "k.9.5"   "k.9.6"   [43]
> "k.9.7"   "k.9.8"   "k.9.9"   "k.10.1" 
> "k.10.2"  "k.10.3"  "k.10.4"  [50]
> "k.10.5"  "k.10.6"  "k.10.7"  "k.10.8" 
> "k.10.9"  "k.10.10"
> >> 
> >> I want to add to the.data new columns: min.k.1,
> min.k.2, ..., min.k.10
> >> 
> >> This is the section of code I would like to
> improve, hopefully getting rid of the eval and the for
> loop:
> >> 
> >> for(k in 1:10){
> >>    s <- subset(the.data,
> select=paste("k", k, 1:k, sep="."))
> >>    eval(parse(text =
> paste("the.data$min.k.", k, "<-as.vector(by(s, 1:nrow(s),
> min))", sep="")))
> >> }
> >> 
> >> Thanks for any help,
> >> Bill
> >> ______________________________________________
> >> 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