Dear helpRs Does anyone have an elegant way of doing the following: For a given numeric vector, e.g. vec <- c(3,2,6,4,7) Create a series of vectors where all but 1 of the values are replaced by 0's, e.g. vec.a <- c(3,0,0,0,0) vec.b <- c(0,2,0,0,0) vec.c <- c(0,0,6,0,0) vec.d <- c(0,0,0,4,0) vec.e <- c(0,0,0,0,7) I have looked at `replace', but can't think of a way of making it produce the 5 lines above without a for loop. I would also like to assign the names automatically. I can create them easily using paste, but how does one get R to treat the resulting character strings as object names to which values can be assigned? Thanks! Karen --- Karen Kotschy Centre for Water in the Environment University of the Witwatersrand, Johannesburg, South Africa -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.
Hi Karen, Try this: vec <- c(3,2,6,4,7) res <- diag(vec) k <- length(vect) for(i in 1:k) assign(paste('vec', letters[i], sep = '.'), res[i,]) vec.a # [1] 3 0 0 0 0 vec.b # [1] 0 2 0 0 0 HTH, Jorge On Tue, Aug 17, 2010 at 6:57 AM, Karen Kotschy <> wrote:> Dear helpRs > > Does anyone have an elegant way of doing the following: > > For a given numeric vector, e.g. vec <- c(3,2,6,4,7) > > Create a series of vectors where all but 1 of the values are replaced by > 0's, e.g. > > vec.a <- c(3,0,0,0,0) > vec.b <- c(0,2,0,0,0) > vec.c <- c(0,0,6,0,0) > vec.d <- c(0,0,0,4,0) > vec.e <- c(0,0,0,0,7) > > I have looked at `replace', but can't think of a way of making it produce > the 5 lines above without a for loop. > > I would also like to assign the names automatically. I can create them > easily using paste, but how does one get R to treat the resulting > character strings as object names to which values can be assigned? > > Thanks! > Karen > > --- > Karen Kotschy > Centre for Water in the Environment > University of the Witwatersrand, Johannesburg, South Africa > > > -- > This message has been scanned for viruses and > dangerous content by MailScanner, and is > believed to be clean. > > ______________________________________________ > 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. >[[alternative HTML version deleted]]
Try this: mapply(function(x, y)assign(x, y, envir = globalenv()), sprintf('vec.%s', letters[1:length(vec)]), split(diag(vec), 1:length(vec))) On Tue, Aug 17, 2010 at 7:57 AM, Karen Kotschy <karen@sevenc.co.za> wrote:> Dear helpRs > > Does anyone have an elegant way of doing the following: > > For a given numeric vector, e.g. vec <- c(3,2,6,4,7) > > Create a series of vectors where all but 1 of the values are replaced by > 0's, e.g. > > vec.a <- c(3,0,0,0,0) > vec.b <- c(0,2,0,0,0) > vec.c <- c(0,0,6,0,0) > vec.d <- c(0,0,0,4,0) > vec.e <- c(0,0,0,0,7) > > I have looked at `replace', but can't think of a way of making it produce > the 5 lines above without a for loop. > > I would also like to assign the names automatically. I can create them > easily using paste, but how does one get R to treat the resulting > character strings as object names to which values can be assigned? > > Thanks! > Karen > > --- > Karen Kotschy > Centre for Water in the Environment > University of the Witwatersrand, Johannesburg, South Africa > > > -- > This message has been scanned for viruses and > dangerous content by MailScanner, and is > believed to be clean. > > ______________________________________________ > 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. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]
Hi, You can use diag() and matrix multiplication to create a matrix with the requested rows, and assign() to store the rows as separate vectors: > vec <- c(3,2,6,4,7) > mat <- diag(vec) > for (i in seq_along(vec)) assign(paste("vec", letters[i], sep="."), mat[i,]) > vec.a [1] 3 0 0 0 0 > vec.b [1] 0 2 0 0 0 Best regards, Charlie Roosen Mango Solutions -----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Karen Kotschy Sent: 17 August 2010 12:58 To: r-help at r-project.org Subject: [R] replacing values in a vector Dear helpRs Does anyone have an elegant way of doing the following: For a given numeric vector, e.g. vec <- c(3,2,6,4,7) Create a series of vectors where all but 1 of the values are replaced by 0's, e.g. vec.a <- c(3,0,0,0,0) vec.b <- c(0,2,0,0,0) vec.c <- c(0,0,6,0,0) vec.d <- c(0,0,0,4,0) vec.e <- c(0,0,0,0,7) I have looked at `replace', but can't think of a way of making it produce the 5 lines above without a for loop. I would also like to assign the names automatically. I can create them easily using paste, but how does one get R to treat the resulting character strings as object names to which values can be assigned? Thanks! Karen --- Karen Kotschy Centre for Water in the Environment University of the Witwatersrand, Johannesburg, South Africa -- This message has been scanned for viruses and\ dangerous...{{dropped:20}}
try this: vec <- c(3,2,6,4,7) n <- length(vec) for(i in seq_along(vec)){ r <- numeric(n) r[i] <- vec[i] assign(paste("vec.", letters[i], sep = ""), r) } I hope it helps. Best, Dimitris On 8/17/2010 12:57 PM, Karen Kotschy wrote:> Dear helpRs > > Does anyone have an elegant way of doing the following: > > For a given numeric vector, e.g. vec<- c(3,2,6,4,7) > > Create a series of vectors where all but 1 of the values are replaced by > 0's, e.g. > > vec.a<- c(3,0,0,0,0) > vec.b<- c(0,2,0,0,0) > vec.c<- c(0,0,6,0,0) > vec.d<- c(0,0,0,4,0) > vec.e<- c(0,0,0,0,7) > > I have looked at `replace', but can't think of a way of making it produce > the 5 lines above without a for loop. > > I would also like to assign the names automatically. I can create them > easily using paste, but how does one get R to treat the resulting > character strings as object names to which values can be assigned? > > Thanks! > Karen > > --- > Karen Kotschy > Centre for Water in the Environment > University of the Witwatersrand, Johannesburg, South Africa > >-- Dimitris Rizopoulos Assistant Professor Department of Biostatistics Erasmus University Medical Center Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands Tel: +31/(0)10/7043478 Fax: +31/(0)10/7043014