[R] data frame component replacement: feature or bug?

Matthew Wiener mcw at ln.nimh.nih.gov
Sun Sep 5 23:08:28 CEST 1999

Hi, all.

The following does not behave as I think it should, and as it seems to me
it has in the past (although I can't check this easily).  I know it
happens in both R-0.64.2 and R-0.65.0 on an old Power Computing running
Linux-PPC 1999, and in R-0.64.2 on an SGI running Irix 6.5.

Try the following:

t1 <- data.frame(matrix(rnorm(16), nc=4))

> t1
          X1 X2 X3 X4 
1 -0.7206945   0.4511310  -1.0638681 -0.9128938 
2 -1.6340557  -0.8063090   0.7753397  0.3607708 
3  0.5999834   0.5256372   0.4393342  1.3218485 
4  2.8542598  -2.8740136   2.0165816 -0.3026954

> dim(t1)
[1] 4 4

> t1$X1 <- 1  
> t1$X2 <- 2

Note that R accepts this.  I think it's replaced t1$X1 with a 
vector of 1's using the usual repeating rules, and similarly for
X2.  So I should still have a 4 X 4 data frame.
R seems to think so too.

> dim(t1)  
[1] 4 4
> is.data.frame(t1)
[1] TRUE


> print(t1)
Error: dim<- length of dims do not match the length of object

> t1[, 1:2]

[1] 1

[1] 2

whereas t1[,3:4] gives me a 4 x 2 data frame as I would expect.

It seems that the "listness" of t1 is beating out it's "matrixness"
(having dimension and so on).  It is possible to get what I want with
t1$X1 <- rep(1, length(t1$X1)).

As I said before, I thought that t1$X1 <- 1 would replace the whole first
column of t1 with 1's.  Did other people think so too?  And is that in
fact the way R should work?

(This example used all numeric columns, in which case a matrix would work.
In some of my real applications, that's not necessarily practical.)


Matt Wiener

r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch

More information about the R-help mailing list