In general, how can I increase a vector of length m (< n) to length n by padding it with m - n missing values, without losing attributes? The two approaches I've tried, using length<- and adding missings with c, do not work in general:> a <- as.Date("2008-01-01") > c(a, NA)[1] "2008-01-01" NA> length(a) <- 2 > a[1] 13879 NA> b <- factor("a") > c(b, NA)[1] 1 NA> length(b) <- 2 > b[1] a <NA> Levels: a Hadley -- http://had.co.nz/
> In general, how can I increase a vector of length m (< n) to length n > by padding it with m - n missing values, without losing attributes? > The two approaches I've tried, using length<- and adding missings with > c, do not work in general: > > > a <- as.Date("2008-01-01") > > c(a, NA) > [1] "2008-01-01" NA > > length(a) <- 2 > > a > [1] 13879 NA > > > > b <- factor("a") > > c(b, NA) > [1] 1 NA > > length(b) <- 2 > > b > [1] a <NA> > Levels: aYou can save the attributes to a new variable, increase the length, then reapply the attributes, e.g. extend <- function(x, n) { att <- attributes(x) length(x) <- n attributes(x) <- att x } a <- as.Date("2008-01-01") extend(a, 2) # [1] "2008-01-01" NA b <- factor("a") extend(b, 2) # [1] a <NA> # Levels: a It would, perhaps, be nicer if length had an option to preserve attributes. Regards, Richie. Mathematical Sciences Unit HSL ------------------------------------------------------------------------ ATTENTION: This message contains privileged and confidential inform...{{dropped:20}}
This may not be everything you would like but perhaps its sufficient:> structure("length<-"(a, 2), class = class(a))[1] "2008-01-01" NA Your second example looks ok as is. Can't tell what you don't like about it. On Wed, Apr 15, 2009 at 10:55 AM, hadley wickham <h.wickham at gmail.com> wrote:> In general, how can I increase a vector of length m (< n) to length n > by padding it with m - n missing values, without losing attributes? > The two approaches I've tried, using length<- and adding missings with > c, do not work in general: > >> a <- as.Date("2008-01-01") >> c(a, NA) > [1] "2008-01-01" NA >> length(a) <- 2 >> a > [1] 13879 ? ?NA > > >> b <- factor("a") >> c(b, NA) > [1] ?1 NA >> length(b) <- 2 >> b > [1] a ? ?<NA> > Levels: a > > Hadley > > > > -- > http://had.co.nz/ > > ______________________________________________ > 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. >
The following approach works for both of your examples: xx <- rep(x, length.out=n) xx[m:n] <- NA Thus:> n <- 2 > aa <- rep(a, length.out=n) > aa[(length(a)+1):n] <- NA > aa[1] "2008-01-01" NA> bb <- rep(b, length.out=n) > bb[(length(b)+1):n] <- NA > bb[1] a <NA> Levels: a>R. Raubertas Merck & Co> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of hadley wickham > Sent: Wednesday, April 15, 2009 10:55 AM > To: r-help > Subject: [R] Extending a vector to length n > > In general, how can I increase a vector of length m (< n) to length n > by padding it with m - n missing values, without losing attributes? > The two approaches I've tried, using length<- and adding missings with > c, do not work in general: > > > a <- as.Date("2008-01-01") > > c(a, NA) > [1] "2008-01-01" NA > > length(a) <- 2 > > a > [1] 13879 NA > > > > b <- factor("a") > > c(b, NA) > [1] 1 NA > > length(b) <- 2 > > b > [1] a <NA> > Levels: a > > Hadley > > > > -- > http://had.co.nz/ > > ______________________________________________ > 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. >Notice: This e-mail message, together with any attachme...{{dropped:12}}