Column-by-column division

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

Column-by-column division

Steven Yen
I have a 10 x 2 matrix x. Like to divide the first column by s[1] and
second column by s[2]. The following lines work but are clumsy. Any
idea? Thanks.

 > x
       [,1] [,2]
  [1,]    1   11
  [2,]    2   12
  [3,]    3   13
  [4,]    4   14
  [5,]    5   15
  [6,]    6   16
  [7,]    7   17
  [8,]    8   18
  [9,]    9   19
[10,]   10   20
 > s
[1] 1 2
 > t(t(x)/s)
       [,1] [,2]
  [1,]    1  5.5
  [2,]    2  6.0
  [3,]    3  6.5
  [4,]    4  7.0
  [5,]    5  7.5
  [6,]    6  8.0
  [7,]    7  8.5
  [8,]    8  9.0
  [9,]    9  9.5
[10,]   10 10.0

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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: Column-by-column division

Rui Barradas
Hello,

Maybe define an infix operator?


`%!%` <- function(x, y) {
   stopifnot(ncol(x) == length(y))
   t(t(x)/y)
}

x <- matrix(1:20, ncol = 2)
s <- 1:2

x %!% s
x %!% 1:4


Hope this helps,

Rui Barradas

Às 11:00 de 03/03/21, Steven Yen escreveu:

> I have a 10 x 2 matrix x. Like to divide the first column by s[1] and
> second column by s[2]. The following lines work but are clumsy. Any
> idea? Thanks.
>
>  > x
>        [,1] [,2]
>   [1,]    1   11
>   [2,]    2   12
>   [3,]    3   13
>   [4,]    4   14
>   [5,]    5   15
>   [6,]    6   16
>   [7,]    7   17
>   [8,]    8   18
>   [9,]    9   19
> [10,]   10   20
>  > s
> [1] 1 2
>  > t(t(x)/s)
>        [,1] [,2]
>   [1,]    1  5.5
>   [2,]    2  6.0
>   [3,]    3  6.5
>   [4,]    4  7.0
>   [5,]    5  7.5
>   [6,]    6  8.0
>   [7,]    7  8.5
>   [8,]    8  9.0
>   [9,]    9  9.5
> [10,]   10 10.0
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> 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 -- To UNSUBSCRIBE and more, see
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: Column-by-column division

Harold Doran
In reply to this post by Steven Yen
To make sure the scalar is used instead of using the recycled vector s, maybe like this

x <- matrix(1:20, nrow=10)
s <- c(1,2)
sapply(1:2, function(i) x[,i]/s[i])

-----Original Message-----
From: R-help <[hidden email]> On Behalf Of Steven Yen
Sent: Wednesday, March 3, 2021 6:00 AM
To: R-help Mailing List <[hidden email]>
Subject: [R] Column-by-column division

I have a 10 x 2 matrix x. Like to divide the first column by s[1] and second column by s[2]. The following lines work but are clumsy. Any idea? Thanks.

 > x
       [,1] [,2]
  [1,]    1   11
  [2,]    2   12
  [3,]    3   13
  [4,]    4   14
  [5,]    5   15
  [6,]    6   16
  [7,]    7   17
  [8,]    8   18
  [9,]    9   19
[10,]   10   20
 > s
[1] 1 2
 > t(t(x)/s)
       [,1] [,2]
  [1,]    1  5.5
  [2,]    2  6.0
  [3,]    3  6.5
  [4,]    4  7.0
  [5,]    5  7.5
  [6,]    6  8.0
  [7,]    7  8.5
  [8,]    8  9.0
  [9,]    9  9.5
[10,]   10 10.0

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see 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 -- To UNSUBSCRIBE and more, see
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: Column-by-column division

Rui Barradas
In reply to this post by Rui Barradas
Hello,

I forgot about sweep:


sweep(x, 2, s, '/')
sweep(x, 2, 1:4, '/')


Hope this helps,

Rui Barradas

Às 11:12 de 03/03/21, Rui Barradas escreveu:

> Hello,
>
> Maybe define an infix operator?
>
>
> `%!%` <- function(x, y) {
>    stopifnot(ncol(x) == length(y))
>    t(t(x)/y)
> }
>
> x <- matrix(1:20, ncol = 2)
> s <- 1:2
>
> x %!% s
> x %!% 1:4
>
>
> Hope this helps,
>
> Rui Barradas
>
> Às 11:00 de 03/03/21, Steven Yen escreveu:
>> I have a 10 x 2 matrix x. Like to divide the first column by s[1] and
>> second column by s[2]. The following lines work but are clumsy. Any
>> idea? Thanks.
>>
>>  > x
>>        [,1] [,2]
>>   [1,]    1   11
>>   [2,]    2   12
>>   [3,]    3   13
>>   [4,]    4   14
>>   [5,]    5   15
>>   [6,]    6   16
>>   [7,]    7   17
>>   [8,]    8   18
>>   [9,]    9   19
>> [10,]   10   20
>>  > s
>> [1] 1 2
>>  > t(t(x)/s)
>>        [,1] [,2]
>>   [1,]    1  5.5
>>   [2,]    2  6.0
>>   [3,]    3  6.5
>>   [4,]    4  7.0
>>   [5,]    5  7.5
>>   [6,]    6  8.0
>>   [7,]    7  8.5
>>   [8,]    8  9.0
>>   [9,]    9  9.5
>> [10,]   10 10.0
>>
>> ______________________________________________
>> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
>> 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 -- To UNSUBSCRIBE and more, see
> 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 -- To UNSUBSCRIBE and more, see
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: Column-by-column division

Steven Yen
Thanks to all. sweep is convenient.

On 2021/3/3 下午 07:16, Rui Barradas wrote:

> Hello,
>
> I forgot about sweep:
>
>
> sweep(x, 2, s, '/')
> sweep(x, 2, 1:4, '/')
>
>
> Hope this helps,
>
> Rui Barradas
>
> Às 11:12 de 03/03/21, Rui Barradas escreveu:
>> Hello,
>>
>> Maybe define an infix operator?
>>
>>
>> `%!%` <- function(x, y) {
>>    stopifnot(ncol(x) == length(y))
>>    t(t(x)/y)
>> }
>>
>> x <- matrix(1:20, ncol = 2)
>> s <- 1:2
>>
>> x %!% s
>> x %!% 1:4
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Às 11:00 de 03/03/21, Steven Yen escreveu:
>>> I have a 10 x 2 matrix x. Like to divide the first column by s[1]
>>> and second column by s[2]. The following lines work but are clumsy.
>>> Any idea? Thanks.
>>>
>>>  > x
>>>        [,1] [,2]
>>>   [1,]    1   11
>>>   [2,]    2   12
>>>   [3,]    3   13
>>>   [4,]    4   14
>>>   [5,]    5   15
>>>   [6,]    6   16
>>>   [7,]    7   17
>>>   [8,]    8   18
>>>   [9,]    9   19
>>> [10,]   10   20
>>>  > s
>>> [1] 1 2
>>>  > t(t(x)/s)
>>>        [,1] [,2]
>>>   [1,]    1  5.5
>>>   [2,]    2  6.0
>>>   [3,]    3  6.5
>>>   [4,]    4  7.0
>>>   [5,]    5  7.5
>>>   [6,]    6  8.0
>>>   [7,]    7  8.5
>>>   [8,]    8  9.0
>>>   [9,]    9  9.5
>>> [10,]   10 10.0
>>>
>>> ______________________________________________
>>> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
>>> 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 -- To UNSUBSCRIBE and more, see
>> 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 -- To UNSUBSCRIBE and more, see
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: Column-by-column division

Eric Berger
In reply to this post by Harold Doran
Why not use standard matrix multiplication which is straightforward here:

x %*% diag(1/s)

HTH,
Eric


On Wed, Mar 3, 2021 at 7:13 AM Harold Doran <
[hidden email]> wrote:

> To make sure the scalar is used instead of using the recycled vector s,
> maybe like this
>
> x <- matrix(1:20, nrow=10)
> s <- c(1,2)
> sapply(1:2, function(i) x[,i]/s[i])
>
> -----Original Message-----
> From: R-help <[hidden email]> On Behalf Of Steven Yen
> Sent: Wednesday, March 3, 2021 6:00 AM
> To: R-help Mailing List <[hidden email]>
> Subject: [R] Column-by-column division
>
> I have a 10 x 2 matrix x. Like to divide the first column by s[1] and
> second column by s[2]. The following lines work but are clumsy. Any idea?
> Thanks.
>
>  > x
>        [,1] [,2]
>   [1,]    1   11
>   [2,]    2   12
>   [3,]    3   13
>   [4,]    4   14
>   [5,]    5   15
>   [6,]    6   16
>   [7,]    7   17
>   [8,]    8   18
>   [9,]    9   19
> [10,]   10   20
>  > s
> [1] 1 2
>  > t(t(x)/s)
>        [,1] [,2]
>   [1,]    1  5.5
>   [2,]    2  6.0
>   [3,]    3  6.5
>   [4,]    4  7.0
>   [5,]    5  7.5
>   [6,]    6  8.0
>   [7,]    7  8.5
>   [8,]    8  9.0
>   [9,]    9  9.5
> [10,]   10 10.0
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> 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 -- To UNSUBSCRIBE and more, see
> 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.
>

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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: Column-by-column division

Harold Doran
Some timings of the different suggestions below

> library(microbenchmark)
> x <- matrix(1:20, nrow=10)
> s <- c(1,2)
> option1 <- sapply(1:2, function(i) x[,i]/s[i])
> option2 <- x %*% diag(1/s)
> option3 <- sweep(x, 2, s, '/')
> all.equal(option1,option2)
[1] TRUE
> all.equal(option2,option3)
[1] TRUE
> microbenchmark(sapply(1:2, function(i) x[,i]/s[i]), x %*% diag(1/s), sweep(x, 2, s, '/'))
Unit: microseconds
                                 expr    min      lq     mean  median     uq      max neval
sapply(1:2, function(i) x[, i]/s[i]) 18.425 19.8800 37.42147 21.5765 22.789 1583.518   100
                      x %*% diag(1/s)  1.456  2.1830  2.86150  2.9100  3.395    9.213   100
                  sweep(x, 2, s, "/") 32.486 34.1825 37.31964 35.3950 36.364  131.395   100

From: Eric Berger <[hidden email]>
Sent: Wednesday, March 3, 2021 3:19 PM
To: Harold Doran <[hidden email]>
Cc: Steven Yen <[hidden email]>; R-help Mailing List <[hidden email]>
Subject: Re: [R] Column-by-column division

Why not use standard matrix multiplication which is straightforward here:

x %*% diag(1/s)

HTH,
Eric


On Wed, Mar 3, 2021 at 7:13 AM Harold Doran <[hidden email]<mailto:[hidden email]>> wrote:
To make sure the scalar is used instead of using the recycled vector s, maybe like this

x <- matrix(1:20, nrow=10)
s <- c(1,2)
sapply(1:2, function(i) x[,i]/s[i])

-----Original Message-----
From: R-help <[hidden email]<mailto:[hidden email]>> On Behalf Of Steven Yen
Sent: Wednesday, March 3, 2021 6:00 AM
To: R-help Mailing List <[hidden email]<mailto:[hidden email]>>
Subject: [R] Column-by-column division

I have a 10 x 2 matrix x. Like to divide the first column by s[1] and second column by s[2]. The following lines work but are clumsy. Any idea? Thanks.

 > x
       [,1] [,2]
  [1,]    1   11
  [2,]    2   12
  [3,]    3   13
  [4,]    4   14
  [5,]    5   15
  [6,]    6   16
  [7,]    7   17
  [8,]    8   18
  [9,]    9   19
[10,]   10   20
 > s
[1] 1 2
 > t(t(x)/s)
       [,1] [,2]
  [1,]    1  5.5
  [2,]    2  6.0
  [3,]    3  6.5
  [4,]    4  7.0
  [5,]    5  7.5
  [6,]    6  8.0
  [7,]    7  8.5
  [8,]    8  9.0
  [9,]    9  9.5
[10,]   10 10.0

______________________________________________
[hidden email]<mailto:[hidden email]> mailing list -- To UNSUBSCRIBE and more, see 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]<mailto:[hidden email]> mailing list -- To UNSUBSCRIBE and more, see
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.

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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.