[R] Loop Help
Rui Barradas
ruipbarradas at sapo.pt
Sat May 19 16:03:36 CEST 2012
Hello,
The error is that you are trying to use the number of rows of a
character string.
TOWERS[1], TOWERS[2], etc, are not data frames. Use a print statement
before the line that throws the error to check it.
Your problem can be solved along the lines of what follows.
Note that I've put all data frames in a list, it's better to have them
kept like that, it makes everything else simpler.
# Create a list with some made up data.frames
towers <- list(TOWER1=data.frame(A=letters[1:4], X=rnorm(4)),
TOWER2=data.frame(A=LETTERS[1:6], X=runif(6)))
towers
# In your case this is from TOWER1 to TOWER7
TOWERS <- names(towers)
towers.with.id <- lapply(TOWERS, function(i){
towers[[ i ]]$Tower <- factor(i)
towers[[ i ]]})
(Use something other than 'towers.with.id', this is just an example.)
#names(towers.with.id) <- TOWERS # (*) See below
towers.with.id
do.call(rbind, towers.with.id)
(*) Try to run these last three instructions with the marked line
commented/uncommented.
It's better to uncomment, maybe after rbind.
You'll later be able to access the list elements with a syntax like
towers.with.id[[ "TOWER2" ]] # full data.frame 2
towers.with.id[[ TOWERS[2] ]]$A # just that column
towers.with.id[[ "TOWER2" ]]$A[3] # third element of that column
If you do.call/rbind before, to solve the rbind-ed data.frame's row
names use
rownames(result) <- seq.int(nrow(result))
where 'result' is the result of do.call.
Hope this helps,
Rui Barradas
Em 19-05-2012 11:00, r-help-request at r-project.org escreveu:
> Date: Fri, 18 May 2012 16:14:08 -0700 (PDT)
> From: bdossman<bdossman at gmail.com>
> To:r-help at r-project.org
> Subject: [R] Loop Help
> Message-ID:<1337382848213-4630555.post at n4.nabble.com>
> Content-Type: text/plain; charset=us-ascii
>
> 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)])
> }
More information about the R-help
mailing list