data.frame(1)*1:4 = 1?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

data.frame(1)*1:4 = 1?

Spencer Graves-2
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.
Reply | Threaded
Open this post in threaded view
|

Re: data.frame(1)*1:4 = 1?

Fabian Amman
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.
Reply | Threaded
Open this post in threaded view
|

Re: data.frame(1)*1:4 = 1?

Joshua Wiley-2
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.
Reply | Threaded
Open this post in threaded view
|

Re: data.frame(1)*1:4 = 1?

Spencer Graves-2
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.