Steven Kang
2009-Aug-25 02:09 UTC
[R] Filling in empty arrays/lists from using "paste" function
Dear R users, I am trying to fill in arrays (5 different according to distinct "id") from objects produced from arbitrary data set below. a <- data.frame(id=rep(c("idA1","idA2","idA3","idA4","idA5"),2),pro=c("bb","uu","ee","tt","uu","gg","tt","bb","gg","ee"),sal=rpois(10,2)) id pro sal 1 idA1 bb 2 2 idA2 uu 0 3 idA3 ee 3 4 idA4 tt 2 5 idA5 uu 4 6 idA1 gg 3 7 idA2 tt 0 8 idA3 bb 1 9 idA4 gg 0 10 idA5 ee 5 My desired outputs (5 arrays/lists classified according to distinct "id" field) are as follow:> TA1bb ee gg tt uu 2 0 3 0 0> TA2bb ee gg tt uu 0 0 0 0 0> TA3bb ee gg tt uu 1 3 0 0 0 ...... similarly for TA4 & TA5. The above results were produced using TA1 <- c(bb=TA1.bb,ee=TA1.ee,gg=TA1.gg,tt=TA1.tt,uu=TA1.uu), TA2 <- c(bb=TA2.bb,ee=TA2.ee,gg=TA2.gg,tt=TA2.tt,uu=TA2.uu*)* etc for TA3~TA5. Although these generate the output I desire, I would like to use a single statement for producing 5 different arrays (instead of 5 different statements) I have tried the following codes, however the last statement (paste("T", substring(i,3,4), sep="") <- c(bb ......) gives error message reading "Error in paste("T", substring(i, 3, 4), sep = "") <- c(bb = paste(paste("T", : target of assignment expands to non-language object" for (i in unique(a$id)) for (j in unique(a$pro)) assign(paste(paste("T", substring(i,3,4), sep=""), j, sep="."), sum(subset(a, a$id == i & a$pro == j)$sal)) paste("T", substring(i,3,4), sep="") <- c(bb=paste(paste("T", substring(i,3,4), sep=""),j, sep="."),ee=paste(paste("T", substring(i,3,4), sep=""),j, sep="."), gg=paste(paste("T", substring(i,3,4), sep=""),j, sep="."),tt=paste(paste("T", substring(i,3,4), sep=""),j, sep="."), uu=paste(paste("T", substring(i,3,4), sep=""),j, sep=".")) Your solution to this problem would be highly appreciated. Steve [[alternative HTML version deleted]]
Uwe Ligges
2009-Aug-25 07:52 UTC
[R] Filling in empty arrays/lists from using "paste" function
I highly suggest to rethink your problem in a way that you store the things labelled, e.g., TA1 to TA5 (as well as all the others) as the elements of a list TA. This way you have just one object TA that can easily be accessed by index operations and the code looks much cleaner in the end. Best, Uwe Ligges Steven Kang wrote:> Dear R users, > > I am trying to fill in arrays (5 different according to distinct "id") > from objects produced from arbitrary data set below. > > a <- > data.frame(id=rep(c("idA1","idA2","idA3","idA4","idA5"),2),pro=c("bb","uu","ee","tt","uu","gg","tt","bb","gg","ee"),sal=rpois(10,2)) > > id pro sal > 1 idA1 bb 2 > 2 idA2 uu 0 > 3 idA3 ee 3 > 4 idA4 tt 2 > 5 idA5 uu 4 > 6 idA1 gg 3 > 7 idA2 tt 0 > 8 idA3 bb 1 > 9 idA4 gg 0 > 10 idA5 ee 5 > My desired outputs (5 arrays/lists classified according to distinct "id" > field) are as follow: > >> TA1 > bb ee gg tt uu > 2 0 3 0 0 > >> TA2 > bb ee gg tt uu > 0 0 0 0 0 > >> TA3 > bb ee gg tt uu > 1 3 0 0 0 > > ...... similarly for TA4 & TA5. > > The above results were produced using TA1 <- > c(bb=TA1.bb,ee=TA1.ee,gg=TA1.gg,tt=TA1.tt,uu=TA1.uu), TA2 <- > c(bb=TA2.bb,ee=TA2.ee,gg=TA2.gg,tt=TA2.tt,uu=TA2.uu*)* etc for TA3~TA5. > Although these generate the output I desire, I would like to use a single > statement for producing 5 different arrays (instead of 5 different > statements) > > I have tried the following codes, however the last statement (paste("T", > substring(i,3,4), sep="") <- c(bb ......) gives error message reading "Error > in paste("T", substring(i, 3, 4), sep = "") <- c(bb = paste(paste("T", > : target of assignment expands to non-language object" > > for (i in unique(a$id)) > for (j in unique(a$pro)) > assign(paste(paste("T", substring(i,3,4), sep=""), j, sep="."), > sum(subset(a, a$id == i & a$pro == j)$sal)) > paste("T", substring(i,3,4), sep="") <- c(bb=paste(paste("T", > substring(i,3,4), sep=""),j, sep="."),ee=paste(paste("T", substring(i,3,4), > sep=""),j, sep="."), > > gg=paste(paste("T", substring(i,3,4), sep=""),j, > sep="."),tt=paste(paste("T", substring(i,3,4), sep=""),j, sep="."), > > uu=paste(paste("T", > substring(i,3,4), sep=""),j, sep=".")) > > Your solution to this problem would be highly appreciated. > > > > Steve > > [[alternative HTML version deleted]] > > ______________________________________________ > 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.