Hello, All:
What's the logic behind "data.frame(1)*1:4" producing a scalar 1? Or the following: data.frame(1:2, 3:4)*5:7 X1.2 X3.4 1 5 21 2 12 20 I stumbled over this, because I thought I was multiplying a scalar times a vector, and obtaining a scalar rather than the anticipated vector. I learned that my "scalar" was in fact a data.frame with one row and one column. What am I missing? Thanks, Spencer ______________________________________________ [hidden email] 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. |
This is because your vector is recycled:
data.frame(1)*1:4 = data.frame(1)*c(1,2,3,4) only the first element is needed since the data frame has nothing else to multiply with c(2,3,4) (x<-data.frame(1:2, 3:4)) X1.2 X3.4 1 1 3 2 2 4 (y<-x*5:7) y[1,1] = x[1,1] * 5 y[2,1] = x[2,1] * 6 y[1,2] = x[1,2] * 7 y[2,2] = x[2,2] * 5 since you have e vector with length 3, for the 4th entry in the data.frame the first element in the vector is recycled. hope this helps On 03-04-2014 08:42, Spencer Graves wrote: > Hello, All: > > > What's the logic behind "data.frame(1)*1:4" producing a scalar > 1? Or the following: > > > data.frame(1:2, 3:4)*5:7 > X1.2 X3.4 > 1 5 21 > 2 12 20 > > > I stumbled over this, because I thought I was multiplying a > scalar times a vector, and obtaining a scalar rather than the > anticipated vector. I learned that my "scalar" was in fact a > data.frame with one row and one column. > > > What am I missing? > > > Thanks, > Spencer > > ______________________________________________ > [hidden email] 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. ______________________________________________ [hidden email] 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. |
In reply to this post by Spencer Graves-2
Hi Spencer,
One piece is that a data frame of the same dimensions as went in comes out. The second piece is that the vector is recycled. So in your first example: data.frame(1) * 1:4 you only end up with the first element: data.frame(1) * 1 If you try: data.frame(1) * 4:1 you get a data frame with a value of 4. Now for: data.frame(1:2, 3:4) * 5:7 recycling kicks in again, and you get: 1 * 5, 2 * 6, 3 * 7, and 4 * 5 When working with vectors, you get recycling and it expands to the greater length vector: 1:3 * 1:6 has length 6. But data frames are sort of a 'higher' class and the dimensions of the data frame trump the vector. A slightly different behavior is observed for matrices: matrix(1:6, ncol=2) * 1:3 Gives recycling as expected to the longer of the vectors, but matrix(1:6, ncol=2) * 1:9 gives an error, but the error is _not_ directly in the multiplication, as it were, but rather the results (which because matrices are stored as vectors has expanded to be the length of the longer vector, here 1:9) do not match the input dimensions of the matrix. In particular, this is the same as trying to do: x <- 1:9 attributes(x)$dim <- c(3, 2) Error in attributes(x)$dim <- c(3, 2) : dims [product 6] do not match the length of object [9] basically, R gets the result of 1:6 * 1:9, but then cannot format it back as a matrix, because the saved dimensions do not fit the new resulting data. You can verify that R does indeed to the calculations if you go under the hood --- the multiplication is done, and then it tries to apply the dims and it errors out. Cheers, Josh On Wed, Apr 2, 2014 at 11:42 PM, Spencer Graves < [hidden email]> wrote: > Hello, All: > > > What's the logic behind "data.frame(1)*1:4" producing a scalar 1? > Or the following: > > > data.frame(1:2, 3:4)*5:7 > X1.2 X3.4 > 1 5 21 > 2 12 20 > > > I stumbled over this, because I thought I was multiplying a scalar > times a vector, and obtaining a scalar rather than the anticipated vector. > I learned that my "scalar" was in fact a data.frame with one row and one > column. > > > What am I missing? > > > Thanks, > Spencer > > ______________________________________________ > [hidden email] 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. > -- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://joshuawiley.com/ Senior Analyst - Elkhart Group Ltd. http://elkhartgroup.com 260.673.5518 [[alternative HTML version deleted]] ______________________________________________ [hidden email] 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. |
Hi, Josh & Fabian:
Thanks for the replies. On 4/3/2014 12:07 AM, Joshua Wiley wrote: > Hi Spencer, > > One piece is that a data frame of the same dimensions as went in comes > out. The second piece is that the vector is recycled. > > So in your first example: > > data.frame(1) * 1:4 > > you only end up with the first element: > > data.frame(1) * 1 > > If you try: > > data.frame(1) * 4:1 > > you get a data frame with a value of 4. > > Now for: > > data.frame(1:2, 3:4) * 5:7 > > recycling kicks in again, and you get: > > 1 * 5, 2 * 6, 3 * 7, and 4 * 5 > > When working with vectors, you get recycling and it expands to the > greater length vector: > > 1:3 * 1:6 > > has length 6. But data frames are sort of a 'higher' class and the > dimensions of the data frame trump the vector. > > A slightly different behavior is observed for matrices: > > matrix(1:6, ncol=2) * 1:3 > > Gives recycling as expected to the longer of the vectors, but > > matrix(1:6, ncol=2) * 1:9 > > gives an error, but the error is _not_ directly in the multiplication, > as it were, but rather the results (which because matrices are stored > as vectors has expanded to be the length of the longer vector, here > 1:9) do not match the input dimensions of the matrix. In particular, > this is the same as trying to do: > > x <- 1:9 > attributes(x)$dim <- c(3, 2) > Error in attributes(x)$dim <- c(3, 2) : > dims [product 6] do not match the length of object [9] > > basically, R gets the result of 1:6 * 1:9, but then cannot format it > back as a matrix, because the saved dimensions do not fit the new > resulting data. You can verify that R does indeed to the calculations > if you go under the hood --- the multiplication is done, and then it > tries to apply the dims and it errors out. Thanks again: This was the insight I was looking for. I was expecting an error or at least a warning and was surprised when I didn't get one. Best Wishes, Spencer > > Cheers, > > Josh > > > > > > > On Wed, Apr 2, 2014 at 11:42 PM, Spencer Graves > <[hidden email] > <mailto:[hidden email]>> wrote: > > Hello, All: > > > What's the logic behind "data.frame(1)*1:4" producing a > scalar 1? Or the following: > > > data.frame(1:2, 3:4)*5:7 > X1.2 X3.4 > 1 5 21 > 2 12 20 > > > I stumbled over this, because I thought I was multiplying a > scalar times a vector, and obtaining a scalar rather than the > anticipated vector. I learned that my "scalar" was in fact a > data.frame with one row and one column. > > > What am I missing? > > > Thanks, > Spencer > > ______________________________________________ > [hidden email] <mailto:[hidden email]> 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. > > > > > -- > Joshua Wiley > Ph.D. Student, Health Psychology > University of California, Los Angeles > http://joshuawiley.com/ > Senior Analyst - Elkhart Group Ltd. > http://elkhartgroup.com > 260.673.5518 -- Spencer Graves, PE, PhD President and Chief Technology Officer Structure Inspection and Monitoring, Inc. 751 Emerson Ct. San JosÃ©, CA 95126 ph: 408-655-4567 web: www.structuremonitoring.com [[alternative HTML version deleted]] ______________________________________________ [hidden email] 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. |
Free forum by Nabble | Edit this page |