[R] inserting elements in a list

j+rhelp@howard.fm j+rhelp at howard.fm
Tue Feb 18 07:27:03 CET 2003


On 17 Feb 2003 20:11:11 +0100, "Peter Dalgaard BSA"
<p.dalgaard at biostat.ku.dk> said:
> Thomas Lumley <tlumley at u.washington.edu> writes:
> 
> >   N<-length(a)
> >   threes<- a==3
> >   offset<- c(0,cumsum(threes)[-N])
> >   a[offset+(1:N)]<-a
> >   a[which(threes)+offset[threes]+1]<-7
> > 
> > for a more vectorised version.  Equally ugly, but understanding
> > these two solutions is probably educational.
> > 
> > Adding elements in the middle is something vectors are not good at, in
> > contrast to (pair-based or linked) lists.

Indeed they're not - and the code above fails to do this insertion:

> a[which(threes)+offset[threes]+1]<-7
> a
[1]  1  2  3  7  6  3 NA  7

The problem is that it is placing the '7's in the correct place, but is
not shifting the right-hand side of the list across to make room.

> 2) Show that the index in the last line is the same as
> 
> which(threes)+seq(length=sum(threes))

That's a neat way to find the right spots to place the '7's - wherever
the '3's were before, plus one spot for each '3' that we've seen so
far... I'm not sure how to insert into the vector rather than replace
though - a quick browse through the list archives didn't turn up any
quick solutions (other than the types of loops suggested in earlier
answers in this thread).
-- 
  Jeremy Howard
  jhoward at fastmail.fm




More information about the R-help mailing list