HI,
The option z5 takes care of it.
z5<-t(x-t(mat)) #still faster than ?sweep()
?dim(z5)
[1] 20? 2
?identical(sweep(-mat,2,x,"+"),z5)
#[1] TRUE
A.K.
________________________________
From: C W <tmrsg11 at gmail.com>
To: arun <smartpink111 at yahoo.com>
Sent: Wednesday, December 5, 2012 5:09 PM
Subject: Re: [R] data manipulation between vector and matrix
Hi Arun,
Sorry, I might be a little unclear with my words.
The dimensions are different. This is what I got:> x-t(mat)
?? ? [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,]? ? 0 ? -1 ? -2 ? -3 ? -4 ? -5 ? -6 ? -7 ? -8? ? -9 ? -10 ? -11 ? -12 ? -13
[2,]? -19? -20? -21? -22? -23? -24? -25? -26? -27 ? -28 ? -29 ? -30 ? -31 ? -32
?? ? [,15] [,16] [,17] [,18] [,19] [,20]
[1,] ? -14 ? -15 ? -16 ? -17 ? -18 ? -19
[2,] ? -33 ? -34 ? -35 ? -36 ? -37 ? -38> sweep(-mat, 2, x, "+")
? ? ? [,1] [,2]
?[1,]? ? 0? -19
?[2,] ? -1? -20
?[3,] ? -2? -21
?[4,] ? -3? -22
?[5,] ? -4? -23
?[6,] ? -5? -24
?[7,] ? -6? -25
?[8,] ? -7? -26
?[9,] ? -8? -27
[10,] ? -9? -28
[11,]? -10? -29
[12,]? -11? -30
[13,]? -12? -31
[14,]? -13? -32
[15,]? -14? -33
[16,]? -15? -34
[17,]? -16? -35
[18,]? -17? -36
[19,]? -18? -37
[20,]? -19? -38> dim(x-t(mat))
[1]? 2 20> dim(sweep(-mat, 2, x, "+"))
[1] 20? 2
On Wed, Dec 5, 2012 at 4:55 PM, arun <smartpink111 at yahoo.com> wrote:
HI Mike,>I didn't understand "except the x-t(mat) output is very different
than the others".? Are you saying that it needs to be transposed?? BTW,
that was z5.
>
>A.K.
>
>
>
>
>
>
>
>________________________________
>From: C W <tmrsg11 at gmail.com>
>To: arun <smartpink111 at yahoo.com>
>Cc: R help <r-help at r-project.org>; Sarah Goslee <sarah.goslee at
gmail.com>
>Sent: Wednesday, December 5, 2012 4:47 PM
>
>Subject: Re: [R] data manipulation between vector and matrix
>
>
>Thanks for the benchmark. ?I actually wanted to go with the winner, except
the x-t(mat) output is very different than the others.
>Mike
>
>
>On Wed, Dec 5, 2012 at 4:40 PM, arun <smartpink111 at yahoo.com>
wrote:
>
>Hi,
>>
>>By comparing the different methods:
>>set.seed(5)
>>?mat1<-matrix(sample(1:1e6,1e6,replace=TRUE),ncol=10000)
>>?set.seed(25)
>>?x<-sample(1:1e6,10000,replace=TRUE)
>>?system.time(z1<-sweep(-mat1,2,x,"+"))
>>#?? user? system elapsed
>>?# 0.076?? 0.000?? 0.069
>>?system.time(z2<-apply(-mat1,1,`+`,x))
>>?#? user? system elapsed
>>?# 0.036?? 0.000?? 0.031
>>?system.time(z3<-aaply(-mat1,1,`+`,x))
>>#?? user? system elapsed
>>#? 1.880?? 0.000?? 1.704
>>?system.time(z4<- x-t(mat1))? #winner
>>#?? user? system elapsed
>>?# 0.004?? 0.000?? 0.007
>>?system.time(z5<- t(x-t(mat1)))
>>#?? user? system elapsed
>>#? 0.008?? 0.000?? 0.009
>>
>>
>>A.K.
>>
>>
>>
>>
>>
>>
>>________________________________
>>From: C W <tmrsg11 at gmail.com>
>>To: arun <smartpink111 at yahoo.com>
>>Cc: R help <r-help at r-project.org>; Sarah Goslee
<sarah.goslee at gmail.com>
>>Sent: Wednesday, December 5, 2012 4:11 PM
>>
>>Subject: Re: [R] data manipulation between vector and matrix
>>
>>
>>thanks, I knew about apply, but did not you you can put plus signs with
quotes. ?That's a cool tricky,
>>Mike
>>
>>
>>On Wed, Dec 5, 2012 at 4:05 PM, arun <smartpink111 at yahoo.com>
wrote:
>>
>>HI,
>>>In addition to ?sweep(), you can use
>>>
>>>apply(-mat,1,`+`,x)
>>>
>>>#or
>>>library(plyr)
>>>aaply(-mat,1,"+",x)
>>>
>>>
>>>A.K.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>----- Original Message -----
>>>From: C W <tmrsg11 at gmail.com>
>>>To: Sarah Goslee <sarah.goslee at gmail.com>
>>>Cc: r-help <r-help at r-project.org>
>>>Sent: Wednesday, December 5, 2012 1:51 PM
>>>Subject: Re: [R] data manipulation between vector and matrix
>>>
>>>Thanks, Sarah.? First time heard about sweep(), it worked just the
way I
>>>wanted.
>>>Mike
>>>
>>>On Wed, Dec 5, 2012 at 1:42 PM, Sarah Goslee <sarah.goslee at
gmail.com> wrote:
>>>
>>>> Hi,
>>>>
>>>> On Wed, Dec 5, 2012 at 1:30 PM, C W <tmrsg11 at
gmail.com> wrote:
>>>> > Dear list,
>>>> > I was curious how to subtract a vector from matrix?
>>>> >
>>>> > Say, I have
>>>> >
>>>> > mat <- matrix(1:40, nrow=20, ncol=2)
>>>> >
>>>> > x <-c(1,2)
>>>>
>>>> Thanks for the actual reproducible example.
>>>>
>>>> > I want,
>>>> >
>>>> > x-mat[1,] and x-mat[2,], and so on... Basically, subtract
column elements
>>>> > of x against column elements in mat.
>>>> >
>>>> > But x-mat won't do it.
>>>>
>>>> This will (note the modification to get x - mat):
>>>> > sweep(-mat, 2, x, "+")
>>>>? ? ? ?[,1] [,2]
>>>>? [1,]? ? 0? -19
>>>>? [2,]? ?-1? -20
>>>>? [3,]? ?-2? -21
>>>>? [4,]? ?-3? -22
>>>>? [5,]? ?-4? -23
>>>> etc.
>>>>
>>>> --
>>>> Sarah Goslee
>>>> http://www.functionaldiversity.org
>>>>
>>>
>>>??? [[alternative HTML version deleted]]
>>>
>>>______________________________________________
>>>R-help at r-project.org 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.
>>>
>>>
>>
>