Hi, I have a table with persons in rows and objects associated to these persons. And I need to transform it to table with objects in rows and persons next to them. As it is shown on the picture. <http://r.789695.n4.nabble.com/file/n4704655/Persons%2C_Objects.png> Can you please help me how to make this transformation in R? Thank you -- View this message in context: http://r.789695.n4.nabble.com/Persons-with-objects-Objects-and-persons-tp4704655.html Sent from the R help mailing list archive at Nabble.com.
Hi mareki, The transformation is not too difficult, but the table format in your example will cause a bit of difficulty. The following function from the plotrix package: categoryReshape<-function(x) { dimx<-dim(x) if(is.null(dimx) || dimx[2]==1) stop("Can only reshape a matrix or data frame with at least two columns") row_values<-sort(unique(x[,1])) column_values<-sort(unique(x[,2])) newx<- as.data.frame(matrix(0,nrow=length(row_values),ncol=length(column_values))) for(row in 1:dimx[1]) { row_index<-which(row_values %in% x[row,1]) column_index<-which(column_values %in% x[row,2]) newx[row_index,column_index]<-1 } names(newx)<-column_values rownames(newx)<-row_values return(newx) } will take a matrix or data frame like this: table1<-read.table(text="object,person A,1 A,2 A,3 A,4 A,5 B,1 B,2 B,3 C,2 C,3 C,5 D,4 E,2 E,3 E,4 E,5",sep=",",header=TRUE) and transform it into a data frame like this: categoryReshape(table1) 1 2 3 4 5 A 1 1 1 1 1 B 1 1 1 0 0 C 0 1 1 0 1 D 0 0 0 1 0 E 0 1 1 1 1 Then if you take each column and format it like this; concat_labels<-function(x,labels) return(paste(labels[as.logical(x)],collapse=";")) sapply(table2,concat.labels,rownames(tables)) 1 2 3 4 5 "A;B" "A;B;C;E" "A;B;C;E" "A;D;E" "A;C;E" you have pretty much what you want. Jim On Sun, Mar 15, 2015 at 9:02 AM, marekl <marek.r at lutonsky.net> wrote:> Hi, > > I have a table with persons in rows and objects associated to these > persons. > And I need to transform it to table with objects in rows and persons next > to > them. As it is shown on the picture. > > <http://r.789695.n4.nabble.com/file/n4704655/Persons%2C_Objects.png> > > Can you please help me how to make this transformation in R? > > Thank you > > > > -- > View this message in context: > http://r.789695.n4.nabble.com/Persons-with-objects-Objects-and-persons-tp4704655.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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]]
Hi Jim, thank you very much for the code. Marek On Sun, Mar 15, 2015 at 11:46 AM, Jim Lemon <drjimlemon at gmail.com> wrote:> Hi mareki, > The transformation is not too difficult, but the table format in your > example will cause a bit of difficulty. The following function from the > plotrix package: > > categoryReshape<-function(x) { > dimx<-dim(x) > if(is.null(dimx) || dimx[2]==1) > stop("Can only reshape a matrix or data frame with at least two columns") > row_values<-sort(unique(x[,1])) > column_values<-sort(unique(x[,2])) > newx<- > > as.data.frame(matrix(0,nrow=length(row_values),ncol=length(column_values))) > for(row in 1:dimx[1]) { > row_index<-which(row_values %in% x[row,1]) > column_index<-which(column_values %in% x[row,2]) > newx[row_index,column_index]<-1 > } > names(newx)<-column_values > rownames(newx)<-row_values > return(newx) > } > > will take a matrix or data frame like this: > > table1<-read.table(text="object,person > A,1 > A,2 > A,3 > A,4 > A,5 > B,1 > B,2 > B,3 > C,2 > C,3 > C,5 > D,4 > E,2 > E,3 > E,4 > E,5",sep=",",header=TRUE) > > and transform it into a data frame like this: > > categoryReshape(table1) > 1 2 3 4 5 > A 1 1 1 1 1 > B 1 1 1 0 0 > C 0 1 1 0 1 > D 0 0 0 1 0 > E 0 1 1 1 1 > > Then if you take each column and format it like this; > > concat_labels<-function(x,labels) > return(paste(labels[as.logical(x)],collapse=";")) > sapply(table2,concat.labels,rownames(tables)) > > 1 2 3 4 5 > "A;B" "A;B;C;E" "A;B;C;E" "A;D;E" "A;C;E" > > you have pretty much what you want. > > Jim > > > On Sun, Mar 15, 2015 at 9:02 AM, marekl <marek.r at lutonsky.net> wrote: > >> Hi, >> >> I have a table with persons in rows and objects associated to these >> persons. >> And I need to transform it to table with objects in rows and persons next >> to >> them. As it is shown on the picture. >> >> <http://r.789695.n4.nabble.com/file/n4704655/Persons%2C_Objects.png> >> >> Can you please help me how to make this transformation in R? >> >> Thank you >> >> >> >> -- >> View this message in context: >> http://r.789695.n4.nabble.com/Persons-with-objects-Objects-and-persons-tp4704655.html >> Sent from the R help mailing list archive at Nabble.com. >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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]]
https://github.com/hadley/devtools/wiki/Reproducibility http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example http://xkcd.com/1478/ John Kane Kingston ON Canada> -----Original Message----- > From: marek.r at lutonsky.net > Sent: Sat, 14 Mar 2015 15:02:55 -0700 (PDT) > To: r-help at r-project.org > Subject: [R] Persons with objects ?> Objects and persons > > Hi, > > I have a table with persons in rows and objects associated to these > persons. > And I need to transform it to table with objects in rows and persons next > to > them. As it is shown on the picture. > > <http://r.789695.n4.nabble.com/file/n4704655/Persons%2C_Objects.png> > > Can you please help me how to make this transformation in R? > > Thank you > > > > -- > View this message in context: > http://r.789695.n4.nabble.com/Persons-with-objects-Objects-and-persons-tp4704655.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.____________________________________________________________ FREE 3D MARINE AQUARIUM SCREENSAVER - Watch dolphins, sharks & orcas on your desktop!
On Mar 15, 2015, at 3:46 AM, Jim Lemon wrote:> Hi mareki, > The transformation is not too difficult, but the table format in your > example will cause a bit of difficulty. The following function from the > plotrix package: > > categoryReshape<-function(x) { > dimx<-dim(x) > if(is.null(dimx) || dimx[2]==1) > stop("Can only reshape a matrix or data frame with at least two columns") > row_values<-sort(unique(x[,1])) > column_values<-sort(unique(x[,2])) > newx<- > > as.data.frame(matrix(0,nrow=length(row_values),ncol=length(column_values))) > for(row in 1:dimx[1]) { > row_index<-which(row_values %in% x[row,1]) > column_index<-which(column_values %in% x[row,2]) > newx[row_index,column_index]<-1 > } > names(newx)<-column_values > rownames(newx)<-row_values > return(newx) > } > > will take a matrix or data frame like this: > > table1<-read.table(text="object,person > A,1 > A,2 > A,3 > A,4 > A,5 > B,1 > B,2 > B,3 > C,2 > C,3 > C,5 > D,4 > E,2 > E,3 > E,4 > E,5",sep=",",header=TRUE) > > and transform it into a data frame like this: > > categoryReshape(table1) > 1 2 3 4 5 > A 1 1 1 1 1 > B 1 1 1 0 0 > C 0 1 1 0 1 > D 0 0 0 1 0 > E 0 1 1 1 1 >> Then if you take each column and format it like this; > > concat_labels<-function(x,labels) > return(paste(labels[as.logical(x)],collapse=";")) > sapply(table2,concat.labels,rownames(tables)) > > 1 2 3 4 5 > "A;B" "A;B;C;E" "A;B;C;E" "A;D;E" "A;C;E"This would be another way of approaching this:> data.frame( pobjects=with( table1, tapply(object, person, FUN=paste, collapse=";"))) pobjects 1 A;B 2 A;B;C;E 3 A;B;C;E 4 A;D;E 5 A;C;E You could also use Jim's data example to build an object that looks more like your input: test <- data.frame( opersons= with(table1, tapply(person, object, paste, collapse=";"))) test opersons A 1;2;3;4;5 B 1;2;3 C 2;3;5 D 4 E 2;3;4;5 And this would let you recover Jim's input object:> stack( sapply(test$opersons, strsplit, ";") )values ind 1 1 A 2 2 A 3 3 A 4 4 A 5 5 A 6 1 B 7 2 B 8 3 B 9 2 C 10 3 C 11 5 C 12 4 D 13 2 E 14 3 E 15 4 E 16 5 E> > you have pretty much what you want. > > Jim > > > On Sun, Mar 15, 2015 at 9:02 AM, marekl <marek.r at lutonsky.net> wrote: > >> Hi, >> >> I have a table with persons in rows and objects associated to these >> persons. >> And I need to transform it to table with objects in rows and persons next >> to >> them. As it is shown on the picture. >> >> <http://r.789695.n4.nabble.com/file/n4704655/Persons%2C_Objects.png> >> >> Can you please help me how to make this transformation in R? >> >> Thank you >>And don't forget that Nabble is not Rhelp: R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see 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. -- David Winsemius Alameda, CA, USA