OK...I'll put in my 2 cents worth. It seems to me that the problem is with this line:
b$a=a , where "s" is something other than a vector with length equal to nrow(b). I had no idea that a dataframe could hold a dataframe. It is not just rbind(b,b) that fails, apply(b,1,sum) fails and so does plot(b). I'll bet other R commands fail as well. My point of view is that a dataframe is a list of vectors of equal length and various types (this is not exactly what the help page says, but it is what it suggests to me). Hum, I wonder how much code is based on the idea that a dataframe can hold a dataframe. 15 years of using R just isn't enough! But, I can say that not one line of code I've written expects a dataframe to hold a dataframe. > Hi, > The following was already a topic on r-help, but after understanding what is > going on, I think it fits better in r-devel. > The problem is this: > When a data.frame has another data.frame in it, rbind doesn't work well. > Here is an example: > -- > > a=data.frame(x=1:10,y=1:10) > > b=data.frame(z=1:10) > > b$a=a > > b > z a.x a.y > 1 1 1 1 > 2 2 2 2 > 3 3 3 3 > 4 4 4 4 > 5 5 5 5 > 6 6 6 6 > 7 7 7 7 > 8 8 8 8 > 9 9 9 9 > 10 10 10 10 > > rbind(b,b) > Error in `row.names<-.data.frame`(`*tmp*`, value = c("1", "2", "3", "4", : > duplicate 'row.names' are not allowed > In addition: Warning message: > non-unique values when setting 'row.names': ?1?, ?10?, ?2?, ?3?, ?4?, ?5?, > ?6?, ?7?, ?8?, ?9? > -- > > Looking at the code of rbind.data.frame, the error comes from the > lines: > -- > xij <- xi[[j]] > if (has.dim[jj]) { > value[[jj]][ri, ] <- xij > rownames(value[[jj]])[ri] <- rownames(xij) # <-- problem is here > } > -- > if the rownames() line is dropped, all works well. What this line > tries to do is to join the rownames of internal elements of the > data.frames I try to rbind. So the result, in my case should have a > column 'a', whose rownames are the rownames of the original column 'a'. It > isn't totally clear to me why this is needed. When would a data.frame > have different rownames on the inside vs. the outside? > Notice also that rbind takes into account whether the rownames of the > data.frames to be joined are simply 1:n, or they are something else. > If they are 1:n, then the result will have rownames 1:(n+m). If not, > then the rownames might be kept. > I think, more consistent would be to replace the lines above with > something like: > if (has.dim[jj]) { > value[[jj]][ri, ] <- xij > rnj = rownames(value[[jj]]) > rnj[ri] = rownames(xij) > rnj = make.unique(as.character(unlist(rnj)), sep = "") > rownames(value[[jj]]) <- rnj > } > In this case, the rownames of inside elements will also be joined, but > in case they overlap, they will be made unique - just as they are for > the overall result of rbind. A side effect here would be that the > rownames of matrices will also be made unique, which till now didn't > happen, and which also doesn't happen when one rbinds matrices that > have rownames. So it would be better to test above if we are dealing > with a matrix or a data.frame. > But most people don't have different rownames inside and outside. > Maybe it would be best to add a flag as to whether you care or don't > care about the rownames of internal data.frames... > But maybe data.frames aren't meant to contain other data.frames? > If instead I do > b=data.frame( z=1:10, a=a) > then rbind(b,b) works well. In this case the data.frame was converted to its > columns. Maybe > b$a = a > should do the same? > Michael > -- > View this message in context: http://r.789695.n4.nabble.com/rbind- > on-data-frame-that-contains-a-column-that-is-also-a-data-frame- > tp2315682p2315682.html > Sent from the R devel mailing list archive at Nabble.com. > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel