[R] vectorization question

Tony Plate tplate at blackmesacapital.com
Thu Aug 14 19:43:11 CEST 2003


 From ?data.frame:
>Details:
>
>      A data frame is a list of variables of the same length with unique
>      row names, given class `"data.frame"'.

Your example constructs an object that does not conform to the definition 
of a data frame (the new column is not the same length as the old 
columns).  Some data frame functions may work OK with such an object, but 
others will not.  For example, the print function for data.frame silently 
handles such an illegal data frame (which could be described as 
unfortunate.)  It would probably be far easier to construct a correct data 
frame in the first place than to try to find and fix functions that don't 
handle illegal data frames.  For adding a new column to a data frame, the 
expressions "x[,new.column.name] <- value" and "x[[new.column.name]] <- 
value" will replicate the value so that the new column is the same length 
as the existing ones, while the "$" operator in an assignment will not 
replicate the value.  (One could argue that this is a deficiency, but I 
think it has been that way for a long time, and the behavior is the same in 
the current version of S-plus.)

 > x1 <- data.frame(a=1:3)
 > x2 <- x1
 > x3 <- x1
 > x1$b <- 0
 > x2[,"b"] <- 0
 > x3[["b"]] <- 0
 > sapply(x1, length)
a b
3 1
 > sapply(x2, length)
a b
3 3
 > sapply(x3, length)
a b
3 3
 > as.matrix(x2)
   a b
1 1 0
2 2 0
3 3 0
 > as.matrix(x1)
Error in as.matrix.data.frame(x1) : dim<- length of dims do not match the 
length of object
 >

At Thursday 04:50 PM 8/14/2003 +0000, Alberto Murta wrote:
>Dear all
>
>I recently noticed the following error when cohercing a data.frame into a
>matrix:
>
> > example <- matrix(1:12,4,3)
> > example <- as.data.frame(example)
> > example$V4 <- 0
> > example
>   V1 V2 V3 V4
>1  1  5  9   0
>2  2  6 10  0
>3  3  7 11  0
>4  4  8 12  0
> > example <- as.matrix(example)
>Error in as.matrix.data.frame(example) : dim<- length of dims do not match 
>the
>length of object
>
>However, if the column to be added has the right number of lines, there's no
>error:
>
> > example <- matrix(1:12,4,3)
> > example <- as.data.frame(example)
> > example$V4 <- rep(0,4)
> > example
>   V1 V2 V3 V4
>1  1  5  9  0
>2  2  6 10  0
>3  3  7 11  0
>4  4  8 12  0
> > example <- as.matrix(example)
> > example
>   V1 V2 V3 V4
>1  1  5  9  0
>2  2  6 10  0
>3  3  7 11  0
>4  4  8 12  0
>
>Shouldn't it work well both ways? I checked the attributes and dims of the
>data frame and they are the same in both cases. Where's the difference that
>originates the error message?
>Thanks in advance
>
>Alberto
>
>platform i686-pc-linux-gnu
>arch     i686
>os       linux-gnu
>system   i686, linux-gnu
>status
>major    1
>minor    7.1
>year     2003
>month    06
>day      16
>language R
>
>
>--
>                                          Alberto G. Murta
>Institute for Agriculture and Fisheries Research (INIAP-IPIMAR)
>Av. Brasilia, 1449-006 Lisboa, Portugal | Phone: +351 213027062
>Fax:+351 213015948 | http://www.ipimar-iniap.ipimar.pt/pelagicos/
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-help




More information about the R-help mailing list