Hey Tom, This solution works great, but if I try to then insert it in my function that I've displayed above and apply it to my split dataframe I get the error message:
Error in `[.default`(xj, i) : invalid subscript type 'list' The reason why I need to try and get this to work within the function is that I'm trying to apply it to a much larger dataframe (nrow=12000,ncol=14). The actual data I'm working with consists of a sampling year, a site, and a bunch of response variables. For each sampling year by site combination I have 3 within year sampling occasions. For the sampling year by site combinations that don't have 3 sampling events I need to fill in the missing occasions with the NAs. Can you see why I might be getting this error message? Thanks On Fri, Mar 6, 2015 at 1:48 PM, Tom Wright <t...@maladmin.com> wrote: > If all you want is to add a row of na's could you just do something > like: > > nExpectedRows<-length(unique(animals)) * length(unique(animalYears)) * 2 > > newDf<-data.frame(animals=rep(NA,nExpectedRows-nrow(comAn)), > animalYears=rep(NA,nExpectedRows-nrow(comAn)), > animalMass=rep(NA,nExpectedRows-nrow(comAn))) > > comAn = rbind(comAn,newDf) > > > > On Thu, 2015-03-05 at 13:41 -0700, Curtis Burkhalter wrote: > > Hello everyone, > > > > I'm having a problem with a function that I wrote that is supposed to > add a > > row to dataframe based upon a conditional statement. To explain I've used > > an example below: > > > > #create data frame > > animals=c("bird","dog","cat") > > animals=rep(animals,each=4) > > animals=animals[1:11] > > animalYears=c(1,1,2,2,1,1,2,2,1,1,2) > > animalMass=round(runif(11,min=10,max=50),0) > > > > comAn=as.data.frame(cbind(animals,animalYears,animalMass)) > > comAn > > > > * animals* *animalYears* *animalMass* > > 1 bird 1 30 > > 2 bird 1 32 > > 3 bird 2 27 > > 4 bird 2 16 > > 5 dog 1 22 > > 6 dog 1 25 > > 7 dog 2 41 > > 8 dog 2 22 > > 9 cat 1 30 > > 10 cat 1 37 > > 11 cat 2 49 > > > > We can see here that for every type of animal I have two years of mass > > measurements, except for the cat in year 2. What I want to do is add an > > additional row to the end of the dataframe that consists strictly of NAs > > and then I can substitute those out later. > > > > So what I first did was split the 'comAn' dataframe into the different > > Animal by Year combos. > > > > #This line splits 'com_An' into a list ordered by the Animal by Year > combos > > comAn_split=split(comAn, paste(comAn$animals,comAn$animalYear)) > > > > Then I wrote the function that identifies whether a particular Animal by > > Year combo is less than two rows in length and if so it should add > another > > row that consists only of NAs using the vector 'NAs': > > > > #This function identifies the length of each Animal by Year combo and > then > > #uses the rbind function built in R to add a row > > #to each animal by year combo if they have less than 2 samples > > > > addNA <- function(comAn) { > > NAs=c(NA,NA,NA) > > ind <- seq_len(nrow(comAn)) > > comAn[ifelse(length(ind)<2,rbind(NAs),length(ind)),] > > } > > > > #This applies the function addNs to the animals data organized in list > > format > > addedNAcomAn <- do.call(rbind, lapply(comAn_split, addNA)) > > addedNAcomAn > > > > When I apply the function to the list of the different Animal by Year > > combos this is what I get: > > animals animalYears animalMass > > bird 1 bird 1 23 > > bird 2 bird 2 50 > > cat 1 cat 1 15 > > cat 2 <NA> <NA> <NA> > > dog 1 dog 1 23 > > dog 2 dog 2 38 > > > > What I expect is this: > > > > animals animalYears animalMass > > 1 bird 1 41 > > 2 bird 1 23 > > 3 bird 2 23 > > 4 bird 2 50 > > 5 dog 1 49 > > 6 dog 1 23 > > 7 dog 2 13 > > 8 dog 2 38 > > 9 cat 1 42 > > 10 cat 1 15 > > 11 cat 2 33 > > 12 NA NA NA > > > > Am I conditioning improperly within the function or am I missing > something > > else. Any help would be greatly appreciated. > > > > Best > > > > > -- Curtis Burkhalter https://sites.google.com/site/curtisburkhalter/ [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.