First, what was going wrong: #this creates a character vector, not an object containing your data sets TOWERS <- c("TOWER1","TOWER2","TOWER3","TOWER4","TOWER5","TOWER6","TOWER7")
for(i in 1:7){ # this creates a variable named "TOWER.i" (not "TOWER.1, TOWER.2, ..., TOWER.7) # which will get overwritten each time through the loop TOWER.i <- TOWERS[i] # This is what causes your error, as TOWER.i is a string ("TOWER1", "TOWER2", ...), and hence nrow(TOWER.i) return NULL TOWER <- rep(i,nrow(TOWER.i)) # if you got to here, you would have got more errors as TOWER.i is cannot be subsetted # (it is a string, not a 'dataset' with columns) TOWER.i <- cbind(TOWER.i[1:2], TOWER, TOWER.i[2:length(TOWER.i)]) } # Note that to create variables like 'TOWER.1', ..., you would have to say something like assign(paste('TOWER', i, sep='.'), TOWERS[[i]]) # inside the loop. However, this is not necessary here and you would keep needing to # access the variable with similar ugliness. Here is the way I might approach this: TOWERS <- list(TOWER1,TOWER2,TOWER3,TOWER4,TOWER5,TOWER6,TOWER7) # create a list of things that look like what you wanted TOWERS.i to look like # (still with column two repeated TOWERS.modified <- mapply(function(x, i) cbind(x[,1:2], i, x[,2:ncol(x)]), TOWERS, 1:length(TOWERS), SIMPLIFY=F) # you can then 'merge' them (though that term would mean something else to most # R programmers - see ?merge) with: TOWERS.combined <- do.call(rbind, TOWERS.modified) #Now what I would actually do is: TOWERS.combined <- do.call(rbind, lapply(1:7, function(i) { x <- get(paste('TOWER', i, sep='')) cbind(x[,1:2], i, x[,2:ncol(x)]) })) Hopefully that makes sense, if not I can provide more explanation, but please try ?do.call, ?get, ?lapply and ?mapply first Simon On Sat, May 19, 2012 at 9:14 AM, bdossman <bdoss...@gmail.com> wrote: > Hi all, > > I am a beginner R user and need some help with a simple loop function. > > Currently, I have seven datasets (TOWER1,TOWER2...TOWER7) that are all in > the same format (same # of col and headers). I am trying to add a new column > (factor) to each dataset that simply identifies the dataset. Ultimately, I > would like to merge all 7 datasets and need that column to identify what > rows came from what dataset. > > Using the code below, I get the error message "Error in rep(i, > nrow(TOWER.i)) : invalid 'times' argument" but it doesn't make sense to me > since nrow should give an integer value. Any help will be really > appreciated. > > TOWERS<-c("TOWER1","TOWER2","TOWER3","TOWER4","TOWER5","TOWER6","TOWER7") > > for(i in 1:7){ > TOWER.i<-TOWERS[i] > TOWER<-rep(i,nrow(TOWER.i)) > TOWER.i<-cbind(TOWER.i[1:2],TOWER, TOWER.i[2:length(TOWER.i)]) > } > > -- > View this message in context: > http://r.789695.n4.nabble.com/Loop-Help-tp4630555.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help@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. ______________________________________________ R-help@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.